1 切換鏡像數據源
前往阿里雲開通容器鏡像服務,進入控制檯後進入鏡像加速器,按照流程操作即可。操作文檔摘錄如下,有刪減:
1.1 Ubuntu/CentOS
(1)安裝/升級 Docker 客戶端
推薦安裝 1.10.0 以上版本的 Docker 客戶端。
(2)配置鏡像加速器
Docker 客戶端版本大於 1.10.0 的用戶,可以通過新建或修改 daemon 配置文件 /etc/docker/daemon.json
來使用加速器。添加以下內容:
{
"registry-mirrors": ["https://58rf2fw7wp0u.mirror.aliyuncs.com"]
}
注意:以上地址僅供參考,應依據實際賬戶提供的爲準
(3)重啓服務
systemctl daemon-reload
systemctl restart docker
1.2 Mac/Windows
登錄阿里雲後,詳見:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2 JDK 容器
(1)在 https://hub.docker.com/_/amazoncorretto?tab=tags 下載鏡像
docker pull amazoncorretto:11.0.6
(2)Dockerfile 內容如下:
FROM amazoncorretto:11.0.6
MAINTAINER clxering <[email protected]>
# 將jar包添加到容器中的目錄
ADD demo.jar /usr/src/
# 運行jar包
ENTRYPOINT ["java","-jar","/usr/src/demo.jar"]
(3)上傳 jar 到 Dockerfile 所在目錄,假設爲 /usr/src/tmp
(4)製作鏡像,參數 -t
表示不需要緩存;指定鏡像名稱爲 springbootapp
docker build -t springbootapp:test .
注:末尾有一個點號
以下爲成功生成鏡像的提示信息:
Sending build context to Docker daemon 24.18MB
Step 1/4 : FROM amazoncorretto:11.0.6
---> 2acf862bb8fb
Step 2/4 : MAINTAINER clxering <[email protected]>
---> Running in 166531df6339
Removing intermediate container 166531df6339
---> a299bd5fb85a
Step 3/4 : ADD demo.jar /usr/src/
---> bcddaeffe8ce
Step 4/4 : ENTRYPOINT ["java","-jar","/usr/src/demo.jar"]
---> Running in 95f3f84fda5e
Removing intermediate container 95f3f84fda5e
---> dcf0f6acf7d8
Successfully built dcf0f6acf7d8
Successfully tagged springbootapp:latest
(5)啓動鏡像並連接到 MySQL
在 application.yml 配置的連接相關內容如下:
spring:
profiles:
active: product
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysqlroot:3306/databasename?
username: xxxx
password: xxxx
則啓動容器命令如下:
docker run -d -p 7077:7077 --link <MySQL容器別名>:mysqlroot springbootapp:test
3 MySQL 容器案例
3.1 常規配置步驟
3.1.1 獲取鏡像
在 https://hub.docker.com/_/mysql?tab=tags 下載鏡像
docker pull mysql:8.0.19
3.1.2 掛載配置文件 my.cnf
配置文件的掛載僅爲了便於修改,非必須步驟。
(1)爲獲取掛載路徑,建立一個測試容器
docker run --name testmysql \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.19
注:用宿主 3307 端口做測試容器的映射
(2)進入測試容器
docker exec -it testmysql bash
(3)在測試容器中查找配置文件位置。可用 cat 命令依次查看給出的路徑是否存在配置文件,最後發現正確路徑爲 /etc/mysql/my.cnf
root@f088aa76bc6f:/# mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
注:上述 1-3 步驟僅供參考,若有其他方式可獲知配置文件路徑,可忽略這些步驟。
(4)在宿主上創建配置文件路徑 mkdir -p /usr/src/mysql/conf
(5)複製測試容器中的配置文件到上述目錄。以後如果要改配置,在掛載路徑的配置文件上修改即可。
docker cp testmysql:/etc/mysql/my.cnf /usr/src/mysql/conf
3.1.3 掛載數據庫數據
容器在關閉或重啓後會清空數據,宜用掛載的方式啓動 MySQL,保存數據庫數據。
(1)查找數據路徑。在測試容器執行 docker inspect testmysql
,在顯示內容中找到 Mount
屬性,其中的 Destination
值即爲路徑
...
"Mounts": [
{
"Type": "volume",
"Name": "20b889c7bf0ee13f654f588e158a840b3feeedac0f35f0d1fca47b4c4617809e",
"Source": "/var/lib/docker/volumes/20b889c7bf0ee13f654f588e158a840b3feeedac0f35f0d1fca47b4c4617809e/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
(2)在宿主上創建數據件路徑 mkdir -p /usr/src/mysql/data
注:若刪除舊容器,新建容器時要清空原掛載數據目錄,除非更換路徑,否則新建的容器將無法啓動。
(3)啓動正式容器並掛載配置文件和數據
docker run --name mysqlroot \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
--restart=always \
--mount type=bind,src=/usr/src/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
--mount type=bind,src=/usr/src/mysql/data,dst=/var/lib/mysql \
-d mysql:8.0.19
參數釋義:
-
--name
,給容器取一個別名爲 mysqlroot -
-p
,映射端口號,將 mysql 的端口號 3306 映射爲 3306 -
-e
,MYSQL_ROOT_PASSWORD : 設置 root 密碼爲 123456 -
--mount
,掛載文件或目錄 -
-d
,後臺運行容器,並返回容器 ID -
mysql:8.0.19
,鏡像名稱 -
--restart=always
,重新啓動 docker 後,帶該參數的容器將自行啓動
注:如果 --restart=always
參數位置放在最後,會報錯:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"--restart=always\": executable file not found in $PATH": unknown.
附加內容:爲已經創建的容器添加 --restart=always
參數
docker container update --restart=always <容器ID>
附加內容:重啓服務器後執行 docker 命令時報錯:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
,此時重啓 daemon 及 docker 即可,執行如下命令:
systemctl daemon-reload
service docker restart
執行 service docker status
查看狀態,輸出信息有 Active: active (running)
提示則說明成功重啓
3.2 Docker 創建運行多個 mysql 容器
假設 3306 端口已經運行一個容器,現在使用宿主機的 3307 端口新開一個容器。執行如下命令:
docker run --name newone \
-p 3307:3306 -e MYSQL_ROOT_PASSWORD=root \
--restart=always \
-d mysql:8.0.19
3.3 docker 容器訪問宿主機的 MySQL
使用 ifconfig 命令可以看到,有一個 docker0 和 eth0,在 docker 容器中可以通過 eth0 的 IP 地址加上端口號(3306)這樣就可以連接宿主機的 MySQL。另外,nginx 可以通過 docker0 的 IP 地址加上構建容器時指定的端口號進行訪問容器。
相關文檔:https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html
4 Nginx 部署
4.1 獲取鏡像
在 https://hub.docker.com/_/nginx?tab=tags 獲取穩定版鏡像
docker pull nginx:stable
4.2 核心文件掛載
(1)建立測試容器
docker run --name nginxtest -d nginx:stable
(2)進入測試容器,根據系統實際情況 定位核心文件路徑
docker exec -it nginxtest bash
(3)定位配置文件路徑
- /etc/nginx/nginx.conf
- /etc/nginx/conf.d/
注:使用整個 conf.d 目錄可便於增加虛擬主機配置文件
(3)定位首頁目錄路徑
- /usr/share/nginx/html
(4)定位日誌文件路徑
- /var/log/nginx
(5)在宿主機新建對應目錄,並拷貝對應目錄
docker cp nginxtest:/etc/nginx/nginx.conf /usr/src/nginxdir/
docker cp nginxtest:/etc/nginx/conf.d/default.conf /usr/src/nginxdir/conf.d/
docker cp nginxtest:/usr/share/nginx/html /usr/src/nginxdir/
docker cp nginxtest:/var/log/nginx /usr/src/nginxdir/log/
4.3 啓動容器
docker run --name nginx \
-p 80:80 \
--restart=always \
--mount type=bind,src=/usr/src/nginxdir/nginx.conf,dst=/etc/nginx/nginx.conf \
--mount type=bind,src=/usr/src/nginxdir/conf.d/,dst=/etc/nginx/conf.d/ \
--mount type=bind,src=/usr/src/nginxdir/html,dst=/usr/share/nginx/html \
--mount type=bind,src=/usr/src/nginxdir/log/nginx,dst=/var/log/nginx \
-d nginx:stable
注:如果 --restart=always
參數位置放在最後,會報錯:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"--restart=always\": executable file not found in $PATH": unknown.
5 其他命令
- 使服務自動啓動,
systemctl enable docker
- 使服務不自動啓動,
systemctl disable docker
- 檢查服務狀態(服務詳細信息),
systemctl status docker
- 檢查服務狀態(僅顯示是否 Active),
systemctl is-active docker
- 顯示所有已啓動的服務,
systemctl list-units --type=service
- 啓動服務,
systemctl start docker
- 停止服務,
systemctl stop docker
- 重啓服務,
systemctl restart docker
- 查看已下載的鏡像,
docker images
, - 刪除指定容器,
docker rm <容器ID>
或docker container rm <容器ID>
, - 顯示當前運行的容器,
dock ps [-a]
或docker container ls [-a]
,添加參數-a
則顯示所有容器,包括停止的 - 使用指定 ID 的鏡像,以交互模式啓動一個容器,在容器內執行 /bin/bash 命令
docker run -itd <鏡像ID> /bin/bash
- 進入容器,
docker exec -it <容器 ID> bash
,ID 不必全部填寫,可辨別即可。如果不指定 /bin/bash,容器運行後會自動停止 - 查看磁盤剩餘空間信息,
df -hl