簡介:
docker可以一條命令就運行一個配置好的服務器,很是方便。
但是也有一個問題就是,當參數比較多,映射目錄比較多,映射端口比較多…………
我以前就是寫個腳本,用腳本來啟動,很low啊。
也見到一些docker鏡像的介紹頁有介紹docker-compose,但是因為一直都是小型的應用,也就沒認真看這個東西,今天就深入學習一下吧。
Docker Compose是一個用來定義和運行復雜應用的Docker工具
里面的數據結構比我幾行腳本清晰的多。而且可以同時啟動多個容器,並且是根據依賴關系來先后啟動。
比如先啟動數據庫,再啟動博客。
官方說明https://docs.docker.com/compose/
我學習的版本可能沒有官方版本新,看不明白,或有更高級需求的,可以去看官方說明。
一:安裝
和安裝docker差不多。
安裝docker是 dnf install docker
安裝docker-compose是 dnf install docker-compose
dnf 是我使用的fedora的包管理工具,根據你的linux版本不同,可能不一樣。
在使用CentOS時發現包管理里面沒有這個包。
可以用docker官方推薦的方法來安裝。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
二:無腦試用
創建docker-compose.yml文件
version: '2'
services:
ssh:
image: jackadam/alpine_with_ssh
ports:
- "2222:22"
然后在同目錄下執行 docker-compose up -d
這樣就啟動了一個開放2222端口的apache。
關閉的時候在這里執行 docker-compose down
三:docker-compose命令
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the name specified
in the client certificate (for example if your docker host
is an IP address)
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
build 構建或重建服務
help 命令幫助
kill 殺掉容器
logs 顯示容器的輸出內容
port 打印綁定的開放端口
ps 顯示容器
pull 拉取服務鏡像
restart 重啟服務
rm 刪除停止的容器
run 運行一個一次性命令
scale 設置服務的容器數目
start 開啟服務
stop 停止服務
up 創建並啟動容器
四:docker-compose.yml
簡介:
這個就是配置容器啟動的參數的。
先看一下官方給的示例:
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
這還是非常方便的,先啟動db,然后啟動wordpress。
下面逐步解釋如何編寫docker-compose.yml
1.基本結構
一個docker-compose.yml包含三大部分:
version services 容器
上面示例中,db 和 wordpress 就是兩個容器。
相關內容的第一行,就是容器的名字了。
2.image
在 services 標簽下的第二級標簽是 web,這個名字是用戶自己自定義,它就是服務名稱。
image 則是指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
例如下面這些格式都是可以的:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd
3.bulid
大家也經常使用Dockerfile來自己生成鏡像。docker-compose自然也是支持的。
不寫image,改為寫buile,則是根據dockerfile來生成鏡像。
示例代碼如下:
build:
context: ../
dockerfile: path/of/Dockerfile
我暫時只用到了
build: .
類似於 docker build .
4.context(配合build)
context 選項可以是 Dockerfile 的文件路徑,也可以是到鏈接到 git 倉庫的url,當提供的值是相對路徑時,它被解析為相對於撰寫文件的路徑,此目錄也是發送到 Docker 守護進程的 context
5.dockerfile(配合build)
使用此 dockerfile 文件來構建,必須指定構建路徑
build:
context: .
dockerfile: Dockerfile-alternate
6.args(配合build)
添加構建參數,這些參數是僅在構建過程中可訪問的環境變量
首先, 在Dockerfile中指定參數:
ARG fendo
ARG password
RUN echo "Build number: $fendo"
RUN script-requiring-password.sh "$password"
然后指定 build 下的參數,可以傳遞映射或列表
build:
context: .
args:
fendo: 1
password: fendo
- fendo=1
- password=fendo
指定構建參數時可以省略該值,在這種情況下,構建時的值默認構成運行環境中的值(還沒理解)
args:
- fendo
- password
YAML布爾值(true
,false
,yes
,no
,on
,off
)必須用引號括起來,這樣分析器會將它們解釋為字符串。
7.container_name
Compose 的容器名稱格式是:<項目名稱><服務名稱><序號>
雖然可以自定義項目名稱、服務名稱,但是如果你想完全控制容器的命名,可以使用這個標簽指定:
container_name: app
8.depends_on
在沒啟動數據庫容器的時候啟動了應用容器,這時候應用容器會因為找不到數據庫而退出,為了避免這種情況我們需要加入一個標簽,就是 depends_on,這個標簽解決了容器的依賴、啟動先后的問題。
例如下面容器會先啟動 redis 和 db 兩個服務,最后才啟動 web 服務:
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
9.ports
端口映射映射主機端口到容器端口
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
- "12400-12500:1240"
10.expose
開放這個服務(容器)的端口
expose:
- "3000"
- "8000"
11.links
較為傳統的link,連接本compose文件中的其他容器
web:
links:
- "db"
- "db:database"
- "redis"
12.external_links
擴展連接link,連接非本compose文件的其他容器,就像docker的--link,用來連接公共服務容器,比如說數據庫。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
13.networks
由於--link一直說要被淘汰,建議使用network方式配置,類似於docker run --net模式
這個是網絡的主配置。
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
注意:
在networks中聲明的網絡名稱,會自從生成為 Folder_some-network Folder_other-network,即在你設定的網絡名稱前面加上當前文件夾名,如果想有互相連通的compose,就把yaml放一個文件夾吧,然后使用docker-compose - ***.yaml [command]
如:
14.ALIASES
別名,網絡中的別名,可以理解為計算機名。可以同時又多個別名。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
下面示例展示了3個容器,使用兩個網絡進行互聯的配置。
version: '2'
services:
web:
build: ./web
networks:
- new
worker:
build: ./worker
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
15.environment
環境變量也就是docker run -e
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:963852741
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET:963852741
16.volumes
卷映射,目錄映射,可以:ro 設置為只讀
volumes:
# 僅創建目錄到宿主機
- /var/lib/mysql
# 創建真實路徑到映射
- /opt/data:/var/lib/mysql
# 從compose文件創建相對目錄的映射
- ./cache:/tmp/cache
# 在linux用戶目錄創建映射
- ~/configs:/etc/configs/:ro
# 在目錄空間中創建
- datavolume:/var/lib/mysql
17.restart
restart 選項,有下面幾種
restart: "no" #從不
restart: always #總是
restart: on-failure #失敗時
restart: unless-stopped #除非停止
18.privileged
privileged選項
privileged: true
19.deploy
v3版本新加的參數,部署參數。有什么CPU限制,內存限制………………
因為deploy在使用的時候,有一些限制,但你的compose文件中出現如下配置項時,deploy就無法使用:
build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
stop_signal
sysctls
userns_mode
20:logging
logging可以設置關於日志的東西。
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
我用到的也就設置日志大小而已。
logging: options:
max-size: "200k"
max-file: "10"
官方文檔才是最新最全的。
https://docs.docker.com/compose/compose-file/
五:實例
1.mariadb
mariadb.yaml
version: "3" #版本3 services: #服務 mysql: #服務名mysql image: mariadb #鏡像名稱 privileged: true #高級權限 tty: true #開一個終端 container_name: mysql #自定義容器名 networks: #網絡 - mynet #屬於網絡mynet ports: #開放端口映射3306-->3306 - 3306:3306 #冒號左邊是宿主機開放端口,冒號右邊是容器開放端口 environment: #啟動變量 MYSQL_ROOT_PASSWORD:123456 #mysql的root密碼 volumes: #目錄映射 - /storage/mariadb:/var/lib/mysql #映射mariadb的數據庫文件存儲路徑,冒號左邊是宿主機路徑,冒號右邊是容器內路徑 networks: #關於網絡的服務 mynet: #聲明網絡mynet
2.wordpress
wordpress.yaml
version: "3" #版本3 services: #服務 wordpress: #服務名wordpress image: wordpress #鏡像名稱 privileged: true #高級權限 tty: true #開一個終端 container_name: wordpress #自定義容器名 networks: #網絡 - mynet #屬於網絡mynet ports: #開放端口映射80-->80 - 80:80 ##冒號左邊是宿主機開放端口,冒號右邊是容器開放端口 environment: #啟動變量mysql的root密碼 WORDPRESS_DB_HOST: mysql #數據庫服務器地址,直接用了另一個容器的容器名 WORDPRESS_DB_NAME: wordpress #數據庫的庫名 WORDPRESS_DB_USER: wordpress #數據庫的用戶名 WORDPRESS_DB_PASSWORD: wordpress #數據庫的密碼 volumes: #目錄映射 - /storage/wordpress:/var/www/html/wp-content #映射wordpress存儲路徑(插件,主題,語言包,上傳文件),冒號左邊是宿主機路徑,冒號右邊是容器內路徑 networks: #關於網絡的服務 mynet: #聲明網絡mynet
3.使用方法
docker-compose -f mariadb.yaml up -d
#后台啟動mariadb容器
#使用任意管理工具,連接3306端口,創建給wordpress用的數據庫,庫名:wordpress,用戶名wordpress,密碼wordpress,%(任意)主機登錄
docker-compose - wordpress.yaml up -d
#后台啟動wordpress容器。
由網絡mynet來進行兩個容器的自動聯通。