docker專題 從入門到放棄
1、docker是什麼
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows作業系統的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。【百度百科】
2、docker怎麼安裝
2.1、線上安裝
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者
curl -sSL https://get.daocloud.io/docker | sh
2.2、離線安裝
先選擇合適的安裝包,下載地址是:
https://download.docker.com/linux/static/stable/x86_64/
然後按以下操作進行
tar xzf docker-20.10.9.tgz
cp docker/* /usr/bin/
cp docker.service /etc/systemd/system/
賦執行許可權
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
#開機啟動
systemctl enable docker.service
啟動docker
systemctl start docker
2.3、檢查
Docker -v
顯示如下資訊則正常
Docker version 20.10.9, build c2ea9bc
3、docker 安裝redis
3.1、線上安裝
從映象倉庫獲取需要安裝的版本,網址是:
預設可以用docker pull redis直接拉映象,拉取的版本是預設latest,同docker pull redis:latest,也可以選擇具體的版本,比如現在redis的穩定版本是6.2.6,那麼就可以用docker pull redis:6.2.6-alpine
用docker images -a展示所有已拉取映象
映象正常展示,則說明映象拉取成功。
3.2、啟動redis
3.2.1、先寫語句
docker run --name redis -p 6389:6379 \
-v /mnt/tools/redis/redis.conf:/etc/redis/redis.conf \
-v /mnt/tools/redis/data:/data \
-d 2cb539a9d29e \
redis-server /etc/redis/redis.conf \
--appendonly yes
3.2.2解釋:
docker run docker啟動容器命令
-- name redis 給啟動的容器自定義一個名字 可以隨意自定義
-p 6389:6379 將容器6379埠對映到宿主機伺服器的6399上
-v /mnt/tools/redis/redis.conf:/etc/redis/redis.conf 將宿主機目錄上的檔案或者資料夾對映到容器指定路徑上,兩者是複製關係,這樣就可以修改宿主機相應資料夾下的檔案,docker會自動同步到容器中去,同理,容器中日誌等資訊會自動同步到宿主機上。
-d 2cb539a9d29e 拉取的映象id,可以通過上一步獲取。
redis-server /etc/redis/redis.conf 指定redis的啟動方式,也可以不指定
appendonly yes 開啟redis持久化
3.2.3 注意事項:
按各伺服器要求,修改redis.conf,修改埠(其實沒必要修改埠,因為每次從映象中啟動一個容器,6379肯定不會被佔用),修改密碼,修改bind(bind不能指定127.0.0.1,如果指定127.0.0.1則表明只能容器內用,宿主機用不了,所以需要bind宿主機內網ip)
3.3、運維
3.3.1 先寫語句
docker exec -it redis bash 進入容器
docker stop redis 停止容器
docker start redis 啟動容器
docker restart redis 重啟容器
docker rm redis 刪除容器
rocker rmi 2cb539a9d29e 刪除redis映象
3.3.2 解釋
docker exec -it 固定進入容器語句
redis 啟動時自定義的容器名稱,或者可以通過docker ps -a 查詢相應的容器,獲取容器的id: CONTAINER ID
bash 也可以寫/bin/bash 固定語句
3.3.3 運維
進入後會發現容器目錄結構類似一個新的centos伺服器,此時 用redis-cli 命令就可以進入,之後的操作跟centos操作相同
4、打離線安裝映象,用於離線安裝
4.1 將執行中的容器打成映象
docker commit 37e6c9bd2cdf redis-6.2.6
解釋
docker commit 固定語句
37e6c9bd2cdf 通過docker ps -a 查詢相應的容器,獲取容器的id
redis-6.2.6 映象名稱,可以自定義,最好帶版本號,因為打出的映象預設是latest版本的
4.2 將映象打成檔案,進行儲存
docker save redis-6.2.6 >/mnt/ redis-6.2.6.tar
解釋:
docker save 固定語句
redis-6.2.6 4.1步驟中儲存的映象名
>/mnt/ redis-6.2.6.tar 輸出到mnt下redis-6.2.6.tar 檔案中
5、離線安裝
docker load </mnt/ redis-6.2.6.tar
6、注意事項
docker 預設啟動時間是0時區,所以啟動時需要在啟動檔案中新增 -e TZ=Asia/Shanghai,也可以第一次設定後,將設定好啟動的容器按照3.4、3.5步驟封裝自己的映象。
4、docker 安裝nginx
4.1 線上安裝
步驟同3.1
4.2 啟動nginx
4.2.1先寫語句
docker run --name nginx -p 80:80\
-v /mnt/tools/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /mnt/tools/nginx/logs:/var/log/nginx \
-v /mnt/workspace/PFMresource:/workspace/PFMresource \
-v /mnt/workspace/Wecredo-PFM-SD-UI:/workspace/Wecredo-PFM-SD-UI \
-v /mnt/workspace/Wecredo-PFM-UI-MH-BAODING:/workspace/Wecredo-PFM-UI-MH-BAODING \
-d b65fb7f3a43a
4.2.2 解釋
其他同3.2.2,特別注意以下
-v /mnt/workspace/PFMresource:/workspace/PFMresource \
-v /mnt/workspace/Wecredo-PFM-SD-UI:/workspace/Wecredo-PFM-SD-UI \
-v /mnt/workspace/Wecredo-PFM-UI-MH-BAODING:/workspace/Wecredo-PFM-UI-MH-BAODING \
Nginx請求的地址都是本地地址,所以需要將宿主機的目錄對映到容器內,讓容器可以請求到
4.3 運維
同3.3
4.4 註釋事項
同注意時區問題
5、docker 安裝mysql
5.1 線上安裝
步驟同3.1
5.2 啟動mysql
5.2.1先寫語句
docker run -p 3306:3306 --name mysql \
-v /mnt/tools/mysql/logs:/var/log/mysql \
-v /mnt/tools/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=@wecredo2022 \
-d a3b66c794c2a
5.2.2 解釋
其他同3.2.2,特別注意以下:-e MYSQL_ROOT_PASSWORD=@wecredo2022,設定root密碼
5.3 運維
同3.3
初始建立資料庫時需要將資料庫檔案docker cp到容器內,然後容器內登入mysql後source /stanfard.sql
5.4 註釋事項
因為容器中沒有編輯器,所以要麼安裝,要麼將容器檔案複製到本機進行修改,然後複製回去,複製語句docker cp mysqld.cnf mysql:/etc/mysql/mysql.conf.d/mysqld.cnf,
綜合以下問題,結論是最好搭建自己的映象。
特別提醒,同一mysql映象啟動容器時,宿主機資料目錄不能相同,會互相沖突。
特別提醒,如果刪除容器,而不主動刪除宿主機資料檔案,那麼重新生成容器並指定該宿主機檔案時,會自動把前一個容器的資料同步到新容器中。
5.4.1 時區不對
可以在啟動項裡面加入-e TZ="Asia/Shanghai"
5.4.2 大小寫敏感
可以在容器中/etc/mysql/mysql.conf.d/mysqld.cnf中新增 lower_case_table_names=1
5.4.3 中文亂碼
可以在容器中/etc/mysql/mysql.conf.d/mysqld.cnf中新增
[mysqld]
character-set-server=utf8
character_set_server=utf8
init_connect=’SET NAMES utf8’
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
[mysqld_safe]
default-character-set = utf8
[client]
default-character-set = utf8
5.4.4控制檯不能輸入中文
可以在啟動項中新增 -e LANG=C.UTF-8
5.4.5 this is incompatible with sql_mode = only_full_group_by問題
可以在容器中/etc/mysql/mysql.conf.d/mysqld.cnf中新增
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
5.4.6 /etc/mysql/mysql.conf.d/mysqld.cnf完整內容如下
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
character-set-server=utf8
lower_case_table_names=1
character_set_server=utf8
init_connect=’SET NAMES utf8’
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
[mysqld_safe]
default-character-set = utf8
[client]
default-character-set = utf8
6、docker 安裝tomcat
6.1 線上安裝
步驟同3.1
6.2 啟動tomcat
6.2.1先寫語句
docker run --name tomcat -p 8081:8080 \
-v /mnt/workspace/logs/:/usr/local/logs/ \
-v /mnt/workspace/tomcat-mh/logs/:/usr/local/tomcat/logs/ \
-v /mnt/workspace/tomcat-mh/war/Wecredo-PFM-SD:/usr/local/tomcat/webapps/Wecredo-PFM-SD \
-v /mnt/workspace/tomcat-mh/conf/server.xml:/usr/local/tomcat/conf/server.xml \
-v /mnt/workspace/PFMresource:/workspace/PFMresource \
-d 693c8f78d52a /usr/local/tomcat/bin/startup.sh
6.2.2 解釋
其他同3.2.2,特別注意以下
/usr/local/tomcat/bin/startup.sh 指定tomcat啟動方式,如果不指定會以預設方式啟動,不會輸出catalina.out檔案
6.3 運維
同3.3
6.4 註釋事項
綜合以下原因,建議打出適用於自己的映象
6.4.1 上傳檔案許可權問題
catalina.sh 修改 UMASK="0002" 設定tomcat上傳檔案許可權
建議將容器中的catalina.sh docker cp到本地,修改後重新cp回去,然後docker restart tomcat,或者啟動時-v 指定catalina.sh 對映檔案
6.4.2 時區問題
-e TZ="Asia/Shanghai"
6.4.3 startup.sh啟動啟動報錯
catalina.sh 修改 "$CATALINA_OUT" 2>&1 "&" 修改為 "$CATALINA_OUT" 2>&1 一共兩處,用於startup.sh啟動
建議將容器中的catalina.sh docker cp到本地,修改後重新cp回去,然後docker restart tomcat,或者啟動時-v 指定catalina.sh 對映檔案
7、docker-compose
7.1先安裝docker,然後安裝docker-compose
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /mnt/docker-compose
賦權
chmod +x /mnt/docker-compose
7.2檢查
./docker-compose –version
7.3 在 jar 包所在路徑建立 Dockerfile 檔案,新增以下內容
FROM java:8
VOLUME /tmp
ADD demo-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
此檔案指定了jdk版本是8 指定了將jar包命名為app.jar 並指明瞭啟動方式
7.4 構建docker-compose.yml檔案
version: '2' # 表示該 Docker-Compose 檔案使用的是 Version 2 file 2和3是有語法區別的
services:
nginx:
image: nginx:1.16.1
ports:
- 80:80
- 443:443
privileged: true
restart: always
volumes:
- /mnt/tools/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /mnt/tools/nginx/conf/keys:/etc/nginx/keys
- /mnt/tools/nginx/conf/conf.d:/etc/nginx/conf.d
- /mnt/tools/nginx/www:/usr/share/nginx/html
- /mnt/tools/nginx/logs:/var/log/nginx
redis:
image: redis:5.0
privileged: true
restart: always
ports:
- 6379:6379
volumes:
- /mnt/tools/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /mnt/tools/redis/data:/data
command:
# 以配置檔案的方式啟動 redis.conf
redis-server /usr/local/etc/redis/redis.conf
demo: # 指定服務名稱
build: . # 指定 Dockerfile 所在路徑,如果就在當前路徑下則可以為空
restart: always
ports: # 指定埠對映
- 8080:8080
depends_on: # 指定依賴服務
- nginx
- redis
7.5 啟動
/mnt/docker/docker-compose up
7.6運維
可以用docker stop等命令運維
也可以用
./docker-compose ps -a 檢視容器
./docker-compose kill demo 幹掉某個容器
等等
8寫在最後
因為用到了,所以才去捋,docker-compose確實不怎麼用,所以沒有過多的研究,歡迎補充完善。