Giới thiệu
Docker hiện đại hóa cách chúng tôi xây dựng và triển khai ứng dụng. Nó cho phép chúng tôi tạo các vùng chứa nhẹ, di động, đủ năng lượng để có thể chạy bất kỳ ứng dụng nào một cách dễ dàng.
Blog này nhằm giải thích cách sử dụng Docker để chạy cơ sở dữ liệu PostgreSQL. Nó không bao gồm cài đặt hoặc cấu hình của docker. Vui lòng tham khảo hướng dẫn cài đặt docker tại đây. Bạn có thể tìm thấy một số thông tin cơ bản bổ sung trong blog trước của chúng tôi về MySQL và Docker.
Trước khi đi vào chi tiết, hãy xem lại một số thuật ngữ.
- Dockerfile
Nó chứa tập hợp các hướng dẫn / lệnh để cài đặt hoặc cấu hình ứng dụng / phần mềm. - Hình ảnh Docker Hình ảnh
Docker được xây dựng từ một loạt các lớp đại diện cho các hướng dẫn từ Dockerfile. Hình ảnh Docker được dùng làm mẫu để tạo vùng chứa. - Liên kết các vùng chứa và mạng do người dùng xác định
Docker đã sử dụng cầu nối làm cơ chế mạng mặc định và sử dụng - liên kết để liên kết các vùng chứa với nhau. Để truy cập vùng chứa PostgreSQL từ vùng chứa ứng dụng, người ta phải liên kết cả hai vùng chứa tại thời điểm tạo. Ở đây, trong bài viết này, chúng tôi đang sử dụng mạng do người dùng xác định vì tính năng liên kết sẽ sớm không được dùng nữa. - Tính ổn định của dữ liệu trong Docker
Theo mặc định, dữ liệu bên trong vùng chứa là tạm thời. Bất cứ khi nào vùng chứa được khởi động lại, dữ liệu sẽ bị mất. Khối lượng là cơ chế ưu tiên để duy trì dữ liệu được tạo và sử dụng bởi vùng chứa Docker. Ở đây, chúng tôi đang gắn một thư mục máy chủ bên trong vùng chứa, nơi lưu trữ tất cả dữ liệu.
Hãy bắt đầu xây dựng hình ảnh PostgreSQL của chúng tôi và sử dụng nó để chạy một vùng chứa.
PostgreSQL Dockerfile
# example Dockerfile for https://docs.docker.com/engine/examples/postgresql_service/
FROM ubuntu:14.04
# Add the PostgreSQL PGP key to verify their Debian packages.
# It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
# Add PostgreSQL's repository. It contains the most recent stable release
# of PostgreSQL, ``9.3``.
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list
# Install ``python-software-properties``, ``software-properties-common`` and PostgreSQL 9.3
# There are some warnings (in red) that show up during the build. You can hide
# them by prefixing each apt-get statement with DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y python-software-properties software-properties-common postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3
# Note: The official Debian and Ubuntu images automatically ``apt-get clean``
# after each ``apt-get``
# Run the rest of the commands as the ``postgres`` user created by the ``postgres-9.3`` package when it was ``apt-get installed``
USER postgres
# Create a PostgreSQL role named ``postgresondocker`` with ``postgresondocker`` as the password and
# then create a database `postgresondocker` owned by the ``postgresondocker`` role.
# Note: here we use ``&&\`` to run commands one after the other - the ``\``
# allows the RUN command to span multiple lines.
RUN /etc/init.d/postgresql start &&\
psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" &&\
createdb -O postgresondocker postgresondocker
# Adjust PostgreSQL configuration so that remote connections to the
# database are possible.
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
# And add ``listen_addresses`` to ``/etc/postgresql/9.3/main/postgresql.conf``
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
# Expose the PostgreSQL port
EXPOSE 5432
# Add VOLUMEs to allow backup of config, logs and databases
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
# Set the default command to run when starting the container
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
Nếu bạn xem xét kỹ Dockerfile, nó bao gồm các lệnh được sử dụng để cài đặt PostgreSQL và thực hiện một số thay đổi cấu hình trên Hệ điều hành ubuntu.
Xây dựng hình ảnh PostgreSQL
Chúng ta có thể tạo một hình ảnh PostgreSQL từ Dockerfile bằng lệnh xây dựng docker.
# sudo docker build -t postgresondocker:9.3 .
Tại đây, chúng ta có thể chỉ định thẻ (-t) cho hình ảnh như tên và phiên bản. Dấu chấm (.) Ở cuối chỉ định thư mục hiện tại và nó sử dụng Dockerfile có trong thư mục hiện tại. Tên tệpocker phải là “Dockerfile”. Nếu bạn muốn chỉ định tên tùy chỉnh cho tệp docker của mình thì bạn nên sử dụng -f
# sudo docker build -t postgresondocker:9.3 -f <your_docker_file_name>
Đầu ra:(Tùy chọn sử dụng cửa sổ văn bản trên thanh cuộn nếu có thể)
Sending build context to Docker daemon 4.096kB
Step 1/11 : FROM ubuntu:14.04
14.04: Pulling from library/ubuntu
324d088ce065: Pull complete
2ab951b6c615: Pull complete
9b01635313e2: Pull complete
04510b914a6c: Pull complete
83ab617df7b4: Pull complete
Digest: sha256:b8855dc848e2622653ab557d1ce2f4c34218a9380cceaa51ced85c5f3c8eb201
Status: Downloaded newer image for ubuntu:14.04
---> 8cef1fa16c77
Step 2/11 : RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
---> Running in ba933d07e226
.
.
.
fixing permissions on existing directory /var/lib/postgresql/9.3/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/9.3/main/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok
Success. You can now start the database server using:
/usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main
or
/usr/lib/postgresql/9.3/bin/pg_ctl -D /var/lib/postgresql/9.3/main -l logfile start
Ver Cluster Port Status Owner Data directory Log file
9.3 main 5432 down postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
update-alternatives: using /usr/share/postgresql/9.3/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-contrib-9.3 (9.3.22-0ubuntu0.14.04) ...
Setting up python-software-properties (0.92.37.8) ...
Setting up python3-software-properties (0.92.37.8) ...
Setting up software-properties-common (0.92.37.8) ...
Processing triggers for libc-bin (2.19-0ubuntu6.14) ...
Processing triggers for ca-certificates (20170717~14.04.1) ...
Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Removing intermediate container fce692f180bf
---> 9690b681044b
Step 5/11 : USER postgres
---> Running in ff8864c1147d
Removing intermediate container ff8864c1147d
---> 1f669efeadfa
Step 6/11 : RUN /etc/init.d/postgresql start && psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" && createdb -O postgresondocker postgresondocker
---> Running in 79042024b5e8
* Starting PostgreSQL 9.3 database server
...done.
CREATE ROLE
Removing intermediate container 79042024b5e8
---> 70c43a9dd5ab
Step 7/11 : RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
---> Running in c4d03857cdb9
Removing intermediate container c4d03857cdb9
---> 0cc2ed249aab
Step 8/11 : RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
---> Running in fde0f721c846
Removing intermediate container fde0f721c846
---> 78263aef9a56
Step 9/11 : EXPOSE 5432
---> Running in a765f854a274
Removing intermediate container a765f854a274
---> d205f9208162
Step 10/11 : VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
---> Running in ae0b9f30f3d0
Removing intermediate container ae0b9f30f3d0
---> 0de941f8687c
Step 11/11 : CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
---> Running in 976d283ea64c
Removing intermediate container 976d283ea64c
---> 253ee676278f
Successfully built 253ee676278f
Successfully tagged postgresondocker:9.3
Tạo mạng vùng chứa
Sử dụng lệnh dưới đây để tạo một mạng do người dùng xác định với trình điều khiển cầu nối.
# sudo docker network create --driver bridge postgres-network
Xác nhận việc tạo mạng
# sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
a553e5727617 bridge bridge local
0c6e40305851 host host local
4cca2679d3c0 none null local
83b23e0af641 postgres-network bridge local
Tạo vùng chứa
Chúng ta cần sử dụng lệnh “docker run” để tạo vùng chứa từ hình ảnh docker. Chúng tôi đang chạy vùng chứa postgres ở chế độ daemonize với sự trợ giúp của tùy chọn -d.
# sudo docker run --name postgresondocker --network postgres-network -d postgresondocker:9.3
Sử dụng lệnh dưới đây để xác nhận việc tạo vùng chứa.
# sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06a5125f5e11 postgresondocker:9.3 "/usr/lib/postgresql…" About a minute ago Up About a minute 5432/tcp postgresondocker
Chúng tôi chưa chỉ định bất kỳ cổng nào để hiển thị, vì vậy, nó sẽ hiển thị cổng postgres mặc định 5432 để sử dụng nội bộ. PostgreSQL chỉ khả dụng từ bên trong mạng Docker, chúng tôi sẽ không thể truy cập vùng chứa Postgres này trên cổng máy chủ.
Chúng ta sẽ xem cách truy cập vùng chứa Postgres trên cổng máy chủ trong phần sau của bài viết này.
Kết nối với vùng chứa PostgreSQL bên trong mạng Docker
Hãy thử kết nối với vùng chứa Postgres từ một vùng chứa khác trong cùng một mạng Docker mà chúng tôi đã tạo trước đó. Ở đây, chúng tôi đã sử dụng ứng dụng khách psql để kết nối với Postgres. Chúng tôi đã sử dụng tên vùng chứa Postgres làm tên máy chủ, người dùng và mật khẩu có trong tệp Docker.
# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=#
Tùy chọn --rm trong lệnh run sẽ xóa vùng chứa sau khi chúng ta kết thúc quá trình psql.
# sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2fd91685d1ea postgresondocker:9.3 "psql -h postgresond…" 29 seconds ago Up 30 seconds 5432/tcp brave_spence
06a5125f5e11 postgresondocker:9.3 "/usr/lib/postgresql…" About a minute ago Up About a minute 5432/tcp postgresondocker
Tính ổn định của dữ liệu
Docker container có bản chất là tạm thời, tức là dữ liệu được sử dụng hoặc tạo bởi vùng chứa không được lưu trữ ngầm ở bất kỳ đâu. Chúng tôi mất dữ liệu bất cứ khi nào vùng chứa được khởi động lại hoặc bị xóa. Docker cung cấp khối lượng mà chúng tôi có thể lưu trữ dữ liệu liên tục. Đây là một tính năng hữu ích mà chúng tôi có thể cung cấp một vùng chứa khác sử dụng cùng một khối lượng hoặc dữ liệu trong trường hợp thiên tai.
Hãy tạo một khối lượng dữ liệu và xác nhận việc tạo ra nó.
# sudo docker volume create pgdata
pgdata
# sudo docker volume ls
DRIVER VOLUME NAME
local pgdata
Bây giờ chúng ta phải sử dụng khối lượng dữ liệu này trong khi chạy vùng chứa Postgres. Đảm bảo rằng bạn xóa vùng chứa postgres cũ hơn đang chạy mà không có ổ đĩa.
# sudo docker container rm postgresondocker -f
postgresondocker
# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3
Chúng tôi đã chạy vùng chứa Postgres với một khối lượng dữ liệu được đính kèm với nó.
Tạo một bảng mới trong Postgres để kiểm tra tính ổn định của dữ liệu.
# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=# \dt
No relations found.
postgresondocker=# create table test(id int);
CREATE TABLE
postgresondocker=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+------------------
public | test | table | postgresondocker
(1 row)
Xóa vùng chứa Postgres.
# sudo docker container rm postgresondocker -f
postgresondocker
Tạo một vùng chứa Postgres mới và xác nhận bảng thử nghiệm có hay không.
# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3
# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+------------------
public | test | table | postgresondocker
(1 row)
Tải xuống Báo cáo chính thức hôm nay Quản lý &Tự động hóa PostgreSQL với ClusterControlTìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng PostgreSQLTải xuống Báo cáo chính thức Hiển thị dịch vụ PostgreSQL cho máy chủ lưu trữ
Bạn có thể nhận thấy rằng chúng tôi đã không hiển thị bất kỳ cổng nào của vùng chứa PostgreSQL trước đó. Điều này có nghĩa là PostgreSQL chỉ có thể truy cập vào các vùng chứa trong mạng postgres mà chúng tôi đã tạo trước đó.
Để sử dụng dịch vụ PostgreSQL, chúng ta cần hiển thị cổng container bằng tùy chọn --port. Ở đây, chúng tôi đã xác định cảng container Postgres 5432 trên cổng 5432 của máy chủ.
# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -p 5432:5432 -d postgresondocker:9.3
# sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
997580c86188 postgresondocker:9.3 "/usr/lib/postgresql…" 8 seconds ago Up 10 seconds 0.0.0.0:5432->5432/tcp postgresondocker
Bây giờ bạn có thể kết nối trực tiếp PostgreSQL trên máy chủ cục bộ.
# psql -h localhost -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=#
Xóa vùng chứa
Để xóa vùng chứa, trước tiên chúng ta cần dừng vùng chứa đang chạy và sau đó xóa vùng chứa bằng lệnh rm.
# sudo docker container stop postgresondocker
# sudo docker container rm postgresondocker
postgresondocker
Sử dụng tùy chọn -f (--force) để xóa trực tiếp vùng chứa đang chạy.
# sudo docker container rm postgresondocker -f
postgresondocker
Hy vọng rằng bây giờ bạn đã có môi trường cục bộ được làm dày đặc của riêng mình cho PostgreSQL.
Lưu ý: Bài viết này cung cấp một cái nhìn tổng quan về cách chúng ta có thể sử dụng PostgreSQL trên docker cho môi trường phát triển / POC. Chạy PostgreSQL trong môi trường sản xuất có thể yêu cầu các thay đổi bổ sung trong cấu hình PostgreSQL hoặc docker.
Kết luận
Có một cách đơn giản để chạy cơ sở dữ liệu PostgreSQL bên trong vùng chứa Docker. Docker đóng gói hiệu quả việc triển khai, cấu hình và các thủ tục quản trị nhất định. Docker là một lựa chọn tốt để triển khai PostgreSQL với những nỗ lực tối thiểu. Tất cả những gì bạn cần làm là khởi động vùng chứa Docker được tạo sẵn và bạn sẽ có cơ sở dữ liệu PostgreSQL sẵn sàng cho dịch vụ của mình.
Tài liệu tham khảo
- Cài đặt Docker:https://docs.docker.com/install
- Tập:https://docs.docker.com/storage/volumes
- Mạng do người dùng xác định:https://docs.docker.com/network/
- Tệp Postgres Docker:https://docs.docker.com/engine/examples/postgresql_service
- MySQL trên Docker:Hiểu khái niệm cơ bản:https://severalnines.com/blog/mysql-docker-containers-und hieu-basics