1. 程式人生 > 其它 >docker專題 從入門到放棄

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、線上安裝

從映象倉庫獲取需要安裝的版本,網址是:

       https://hub.docker.com/

預設可以用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確實不怎麼用,所以沒有過多的研究,歡迎補充完善。