Docker入门到精通开发指南(一文搞懂)
文章目錄
- 安裝
- 官方安裝文檔
- 具體安裝步驟
- 1.卸載之前的版本(如果之前未用過忽略該步驟)
- 2.安裝相關依賴
- 3.設置docker鏡像
- 4.安裝docker
- 安裝latest版本
- 指定版本安裝
- 5.啟動docker
- 6.查看docker版本
- 7.運行一個docker hello world
- 8.卸載docker
- 9.配置阿里云鏡像加速地址
- docker常用命令
- docker倉庫搜索
- 基礎命令
- docker版本信息
- docker系統信息
- 鏡像命令
- 查看本地主機上所有鏡像
- 搜索鏡像
- 下載鏡像
- 刪除鏡像
- 批量刪除鏡像
- 容器命令
- 下載centos進行測試
- 下載
- 啟動
- 查看正在運行的docker
- 退出容器
- 刪除容器
- 啟動和停止
- 常用其他命令
- 查看日志
- 滾動查看日志,并且打印時間
- 查看容器內部進程信息
- 查看docker原信息
- 進入當前運行的容器
- 文件從容器內copy到主機上(手動命令行copy)
- 保存與加載 SAVE LOAD
- 可視化 Portainer
- 安裝
- 具體使用參考文章
- Commit鏡像
- 運行一個centos
- 做一些修改操作
- 退出容器
- 提交
- 數據卷使用
- 方式一:直接使用命令掛 -v
- 實戰:Mysql數據卷掛載
- 方式二:具名掛載、匿名掛載
- 匿名掛載
- 具名掛載
- 指定目錄、具名、匿名三者區別
- volume 容器內卷信息查看
- volume ls 查看所有卷
- volume inspect $VOLUM_NAME 查看卷信息
- 擴展:指定容器內目錄權限
- DockerFile掛載volume
- 容器之間目錄文件共享 --volumes-from
- DockerFile
- DockerFile指令
- 創建一個CentOS
- 查看我們鏡像的變更記錄
- DockerFile制作Java項目啟動
- 發布鏡像
- 發布鏡像到DockerHub
- 發布鏡像到阿里云容器服務
- 自定義網絡
- 多個自定義網絡連通
- network connect 連通
- 實戰
- Docker 配置Redis集群
安裝
官方安裝文檔
地址:https://docs.docker.com/engine/install/centos/
這里使用Linux安裝
具體安裝步驟
1.卸載之前的版本(如果之前未用過忽略該步驟)
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.安裝相關依賴
yum install -y yum-utils3.設置docker鏡像
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo4.安裝docker
安裝latest版本
yum install -y docker-ce docker-ce-cli containerd.io這里會默認安裝latest版本。
指定版本安裝
- 查看版本
- 指定版本安裝
example:
docker-ce-18.09.15.啟動docker
systemctl start docker6.查看docker版本
> docker version Client: Docker Engine - CommunityVersion: 20.10.9API version: 1.41Go version: go1.16.8Git commit: c2ea9bcBuilt: Mon Oct 4 16:08:14 2021OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 20.10.9API version: 1.41 (minimum version 1.12)Go version: go1.16.8Git commit: 79ea9d3Built: Mon Oct 4 16:06:37 2021OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.4.11GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8runc:Version: 1.0.2GitCommit: v1.0.2-0-g52b36a2docker-init:Version: 0.19.0GitCommit: de40ad07.運行一個docker hello world
docker run hello-world8.卸載docker
yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd9.配置阿里云鏡像加速地址
登錄阿里云->點擊容器鏡像服務
點擊鏡像加速器
服務器配置,重啟生效
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://${自己的id}.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart dockerdocker常用命令
docker倉庫搜索
https://hub.docker.com/search?q=&type=image
基礎命令
docker版本信息
docker versiondocker系統信息
docker info鏡像命令
查看本地主機上所有鏡像
[root@test11 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 3 weeks ago 13.3kB redis latest 621ceef7494a 9 months ago 104MB# 說明 REPOSITORY 鏡像的倉庫源 TAG 鏡像的標簽 IMAGE ID 鏡像的id CREATED 鏡像創建的時間 SIZE 鏡像的大小# 其他指令 Options:-a, --all 列出所有鏡像-q, --quiet 只顯示鏡像id搜索鏡像
[root@test11 ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11551 [OK] mariadb MariaDB Server is a high performing open sou… 4398 [OK]下載鏡像
docker pull 鏡像名[:TAG]
[root@test11 ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql b380bbd43752: Pull complete f23cbf2ecc5d: Pull complete 30cfc6c29c0a: Pull complete b38609286cbe: Pull complete 8211d9e66cd6: Pull complete 2313f9eeca4a: Pull complete 7eb487d00da0: Pull complete 4d7421c8152e: Pull complete 77f3d8811a28: Pull complete cce755338cba: Pull complete 69b753046b9f: Pull complete b2e64b0ab53c: Pull complete Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latestdocker pull mysql 與 docker pull docker.io/library/mysql:latest 相同
- 指定版本下載
刪除鏡像
docker rmi -f IMAGEID|鏡像名稱 #空格可以刪除多個鏡像批量刪除鏡像
docker rmi -f ${docker images -qa}容器命令
下載centos進行測試
下載
[root@test11 ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest啟動
docker run [可選參數] iamge# 參數說明 --name="Name01" 容器名稱 app01 app02,用來區分啟動的容器 -d 后臺方式運行 -it 使用交互方式運行,進入容器查看內容 -p 指定容器的端口-p 主機端口:容器端口 (常用)-p 容器端口 -P # 啟動并進入centos docker run -it 5d0da3dc9764 /bin/bash 或 docker run -it centos /bin/bash#退出容器 exit查看正在運行的docker
docker ps-a 查看歷史運行過的docker -n=? 顯示最近的容器數量 -q 只顯示容器的編號退出容器
exit 退出并停止程序 ctrl + P + Q 容器不停止退出刪除容器
docker rm -f 容器id docker rm -f ${docker ps -qa}# -f 可以刪除在運行的容器,不使用-f只能刪除未在運行的容器啟動和停止
docker start 容器id # 啟動 docker stop 容器id # 停止 docker restart 容器id # 重啟 docker kill 容器id # 強制停止常用其他命令
查看日志
# docker logs --helpUsage: docker logs [OPTIONS] CONTAINERFetch the logs of a containerOptions:--details Show extra details provided to logs-f, --follow Follow log output--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)--tail string Number of lines to show from the end of the logs (default "all")-t, --timestamps Show timestamps--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)滾動查看日志,并且打印時間
> docker logs -f --tail 10 -t ${容器id}查看容器內部進程信息
docker top 容器ID查看docker原信息
docker inspect 容器id進入當前運行的容器
方法1(常用)
docker exec -it 容器id /bin/bash # 進入容器后開啟一個新的終端方法2
docker attach 容器id # 進入當前正在執行的終端文件從容器內copy到主機上(手動命令行copy)
docker cp 容器id:容器內路徑 目的主機路徑保存與加載 SAVE LOAD
保存
docker save 963d2d22e6e3 > kafka-eagle-2.0.1-docker.tar加載
docker load < kafka-eagle-2.0.1-docker.tar # 加載完成后可以查看到 docker images可視化 Portainer
安裝
docker run -d -p 9000:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer具體使用參考文章
點擊這里
Commit鏡像
主要作用是將自己修改過的一些配置、文件等,提交成一個自己的鏡像,類似于快照的功能。供自己后續使用。
這里用docker centos進行測試,我們再centos中加一些文件,然后commit成一個新的鏡像。
運行一個centos
docker run -it centos /bin/bash做一些修改操作
# 默認沒有安裝vim [root@f383457af325 /]# vim bash: vim: command not found # 我們安裝下vim [root@f383457af325 /]# yum install vim # 再新增一個文件 [root@f383457af325 ~]# echo '123' > commit-test.txt退出容器
ctrl + p + q提交
語法docker commit [OPTIONS] CONTAINERID [REPOSITORY[:TAG]]OPTIONS說明:-a :提交的鏡像作者;-c :使用Dockerfile指令來創建鏡像;-m :提交時的說明文字;-p :在commit時,將容器暫停。CONTAINERID 是運行容器ID
[root@test11 ~]# docker commit -a "jast" -m "測試commit" f383457af325 test:v1.0.0 sha256:43f512a896d965ad26f9defb9194b1ce87489d2090f2f72e7ed7f4caef1ae908commit后查看下提交后的image,此時鏡像就提交成功。
[root@test11 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v1.0.0 43f512a896d9 29 seconds ago 304MB啟動commit后的鏡像進行驗證鏡像是否為我們提交時的狀態
# 運行我們commit的images [root@test11 ~]# docker run -it 43f512a896d9 /bin/bash [root@588a36c75d1e /]# cd # 查看我們保存的文件,發現文件與內容都相同 [root@588a36c75d1e ~]# ls anaconda-ks.cfg anaconda-post.log commit-test.txt original-ks.cfg [root@588a36c75d1e ~]# cat commit-test.txt 123文件內容都為之前我們保存的內容,說明我們commit生效
數據卷使用
將容器內的目錄掛在到Linux,例將容器內的數據庫數據存儲目錄放在Linux中,而不是容器中。
方式一:直接使用命令掛 -v
docker run -it -v 主機目錄:容器內目錄 [-v 主機目錄:容器內目錄]1.主機目錄不存在則會自動創建
2.修改是雙向的,即雙向綁定/同步的概念,在linux中直接修改主機目錄下的文件,容器內也會同步修改。即便是容器停止,我們再Linux中修改文件,容器再次啟動容器內也會修改。
查看容器掛載信息 Mounts
實戰:Mysql數據卷掛載
[root@test11 ~]# docker run -d -p 3333:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 83f08abd501cf0ae1bdc6adec5f4e3fc247abd081eb9ae0ec1d04d6b370828e8服務器中測試連接
查看Linux掛載的目錄,初始化的數據都存在
在mysql中創建數據庫test_001,查看linux目錄也同時存在,說明數據卷掛載成功
[root@test11 data]# ls auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test_001方式二:具名掛載、匿名掛載
匿名掛載
-v 容器內路徑 docker run -d -P --name nginx01 -v /etc/nginx nginx具名掛載
-v 名稱:容器內路徑 docker run -d -P --name nginx02 -v jmgz:/etc/nginx nginx指定目錄、具名、匿名三者區別
-v 容器內路徑 # 匿名掛載 -v 卷名:容器內路徑 # 具名掛載 -v /Linux路徑:容器內路徑 # 指定路徑掛載(使用volume查看不到)docker run -d -P --name nginx02 -v /home/nginx:/etc/nginx nginx docker run -d -P --name nginx02 -v jmgz:/etc/nginx nginx docker run -d -P --name nginx02 -v /etc/nginx nginx指定目錄以/開頭
具名為名稱開頭
匿名只有一個容器內部的目錄
volume 容器內卷信息查看
volume ls 查看所有卷
[root@test11 volumes]# docker volume ls DRIVER VOLUME NAME local 9c5d88889544e28e1268853fd91705401b29a80394bae71ebe1243d66d9f9243 local 325c6c6fcb0079b2ef18c573d3e76bf0186b8fdd610269f19f2e83ccfe53d7c8 local b24d3abe53938a464810c298f9c02117c686d7fc06c4917932fd69f7e9ded284 local b35cf901596e7bec2dd6244a28873a3b885fc6e4b429e8e27af9629e74884abe local jmgzvolume inspect $VOLUM_NAME 查看卷信息
[root@test11 volumes]# docker volume inspect jmgz [{"CreatedAt": "2021-10-21T11:30:13+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/jmgz/_data","Name": "jmgz","Options": null,"Scope": "local"} ]擴展:指定容器內目錄權限
# -v 容器內路徑:ro rw 改變讀寫權限 ro readonly # 只讀 rw readwrite # 讀寫docker run -d -P --name nginx02 -v jmgz:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v jmgz:/etc/nginx:rw nginx# ro 設置之后容器對容器內的文件只有讀的權限,需要修改只能通過Linux中進行操作DockerFile掛載volume
具體內容在下面DockerFile中介紹
創建一個文件,名稱隨意,內容如下
build
[root@test16 docker]# docker build -f ./build.txt -t jast/centos:1.0 . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM centos---> 5d0da3dc9764 Step 2/3 : VOLUME ["volume01","volume02"]---> Running in 66d549a0c6dd Removing intermediate container 66d549a0c6dd---> 1f81b9a8505c Step 3/3 : CMD /bin/bash---> Running in 04b134fc3f1e Removing intermediate container 04b134fc3f1e---> 61380fa83790 Successfully built 61380fa83790 Successfully tagged jast/centos:1.0查看我們生成的鏡像
[root@test16 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jast/centos 1.0 61380fa83790 40 seconds ago 231MB centos latest 5d0da3dc9764 5 weeks ago 231MB進入容器內查看到我們掛載的目錄,volume01,volume01
[root@test16 docker]# docker run -it 61380fa83790 /bin/bash [root@c04e995e2ed0 /]# ls bin etc lib lost+found mnt proc run srv tmp var volume02 dev home lib64 media opt root sbin sys usr volume01查看我們掛載的目錄
> docker inspect 7bc94d570d32 ... "Mounts": [{"Type": "volume","Name": "e60e87be382e28ddbc6c03782823c31e12e9bbf50b5931a86c9f0743897a056c","Source": "/var/lib/docker/volumes/e60e87be382e28ddbc6c03782823c31e12e9bbf50b5931a86c9f0743897a056c/_data","Destination": "volume01","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "a521e7ac3b134f953d1b7e63c1fc596e10ab9236ca959f97cab8f0ea92d2f79d","Source": "/var/lib/docker/volumes/a521e7ac3b134f953d1b7e63c1fc596e10ab9236ca959f97cab8f0ea92d2f79d/_data","Destination": "volume02","Driver": "local","Mode": "","RW": true,"Propagation": ""}]...容器之間目錄文件共享 --volumes-from
主要應用場景:比如我們配置文件共享
# 運行第一個centos容器(上一個步驟的生成的鏡像掛載了兩個目錄volume01,volume02) > docker run -it 61380fa83790 /bin/bash # 運行第二個容器,通過--volumes-from與01的容器數據卷共享 > docker run -it --name docker02 --volumes-from ${繼承的掛載volumes} ${需要闖將的images} > docker run -it --name docker02 --volumes-from 7bc94d570d32 centos在docker02中寫入數據,然后在docker01中查看發現可以正常看到
[root@test16 ~]# docker attach 7bc94d570d32 [root@7bc94d570d32 /]# ls bin etc lib lost+found mnt proc run srv tmp var volume02 dev home lib64 media opt root sbin sys usr volume01 [root@7bc94d570d32 /]# cd volume01/ [root@7bc94d570d32 volume01]# ls [root@7bc94d570d32 volume01]# touch 123 [root@7bc94d570d32 volume01]# ls 123# 另外一個docker [root@0e37a1ad8df4 /]# cd volume01/ [root@0e37a1ad8df4 volume01]# ls 123多個容器之間也可以通過該方法進行數據共享,同時刪除某一個容器,其他容器數據是不會刪除的。(數據時間是復制同步關系)
DockerFile
Dockerfile是一個包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。
DockerFile:構建文件
DockerImages:通過DockerFile構建生成的鏡像,最終發布和運行
Docker 容器:容器是鏡像運行起來提供服務的
DockerFile指令
| FROM | 基礎鏡鏡像 |
| MAINTAINER | 鏡像作者信息 |
| RUN | 鏡像構建的時候需要運行的命令 |
| ADD | COPY文件,會自動解壓 |
| WORKDIR | 鏡像的工作目錄 |
| VOLUME | 掛載的目錄 |
| EXPOSE | 暴露端口配置,這里配置了就不需要在啟動時使用-p進行配置 |
| CMD | 指定這個容器啟動的時候曼運行的命令,只有最后一個會生效,可被替代 |
| ENTRYPOINT | 與CMD類似,指定這個容器啟動的時候要運行的命令,可以追加命令 |
| ONBUILD | 當構建一個被繼承DockerFile 這個時候就會運行ONBUILD 的指令。觸發指令。 |
| COPY | 類似ADD。將我們文件拷貝到鏡像中 |
| ENV | 構建的時候設置環境變量 |
創建一個CentOS
我們在基礎的centos中安裝vim與ifconfig命令
# 集成centos基礎版本 FROM centos # 作者信息 MAINTAINER jast # 設置工作目錄,即進入容器后默認目錄 ENV MYPATH /usr/local # WORKDIR $MYPATHRUN yum -y install vim RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH CMD /bin/bashbuild
docker build -f ./centos.dockerfile -t jast-centos:0.0.1 .-f centos.dockerfile是指定我們dockerfile文件,如果我們文件命名為Dockerfile 則不用指定 -f,系統會默認獲取該文件
我們進入我們創建好的centos,發現進入容器后,當前目錄為我們剛剛設置的工作目錄;vim與ifconfig命令都可以使用,說明我們的設置生效
[root@test16 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jast-centos 0.0.1 0eb128178c9e 14 minutes ago 336MB jast/centos 1.0 61380fa83790 18 hours ago 231MB centos latest 5d0da3dc9764 5 weeks ago 231MB [root@test16 docker]# docker run -it 0eb128178c9e /bin/bash [root@2689dd9fc60e local]# pwd /usr/local [root@2689dd9fc60e local]# echo $MYPATH /usr/local [root@2689dd9fc60e local]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.17.0.4 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:ac:11:00:04 txqueuelen 0 (Ethernet)RX packets 8 bytes 648 (648.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0查看我們鏡像的變更記錄
docker history $IMAGEID
[root@test16 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jast-centos 0.0.1 0eb128178c9e 21 minutes ago 336MB jast/centos 1.0 61380fa83790 18 hours ago 231MB centos latest 5d0da3dc9764 5 weeks ago 231MB [root@test16 docker]# docker history 0eb128178c9e IMAGE CREATED CREATED BY SIZE COMMENT 0eb128178c9e 21 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 62a81bb2ccbb 21 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B b243f2d95c88 21 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 37365b1cd9f0 21 minutes ago /bin/sh -c yum -y install net-tools 32.4MB 0d1152378bdc 21 minutes ago /bin/sh -c yum -y install vim 72.7MB dcf50fca935d 29 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B da408c837890 29 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B 45b873abd869 29 minutes ago /bin/sh -c #(nop) MAINTAINER jast 0B 5d0da3dc9764 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 5 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 5 weeks ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MBCMD 與 ENTRYPOINT 區別
大家可以參考:https://blog.csdn.net/u010900754/article/details/78526443
DockerFile制作Java項目啟動
編寫dockerfile
FROM centos # 添加jdk,使用ADD docker會自動解壓 ADD jdk-8u311-linux-x64.tar.gz /opt # 將我們準備的java程序文件復制到容器內的/opt/app中 COPY app /opt/appWORKDIR /opt/appENV JAVA_HOME /opt/jdk1.8.0_311 ENV CLASSPATH .:$CLASSPATH:$JAVA_HOME/lib ENV PATH $PATH:$JAVA_HOME/binENTRYPOINT ["java","-cp","lib/*:test.jar","jast.temp.PrintInfo"]app目錄
[root@test16 app]# ls -l 總用量 44 drwxr-xr-x. 2 root root 4096 10月 22 14:24 lib drwxr-xr-x. 2 root root 6 10月 22 15:47 logs -rw-r--r--. 1 root root 95 10月 22 15:49 run.sh -rw-r--r--. 1 root root 33262 10月 22 14:24 test.jarjava文件中內容就是簡單的輸出日期,內容如下
public class PrintInfo {public static void main(String[] args) throws InterruptedException {while(true){System.out.println(new Date());Thread.sleep(1000);}} }build鏡像
[root@test16 jast-springboot-docker]# docker build -t jast-test-docker . Sending build context to Docker daemon 554.4MB Step 1/8 : FROM centos---> 5d0da3dc9764 Step 2/8 : ADD jdk-8u311-linux-x64.tar.gz /opt---> 365ac8e7b845 Step 3/8 : COPY app /opt/app---> bddc1407e654 Step 4/8 : WORKDIR /opt/app---> Running in ba2637ebeefe Removing intermediate container ba2637ebeefe---> a6164e29c00c Step 5/8 : ENV JAVA_HOME /opt/jdk1.8.0_311---> Running in 89e6ab05eafa Removing intermediate container 89e6ab05eafa---> 3683f68f453b Step 6/8 : ENV CLASSPATH .:$CLASSPATH:$JAVA_HOME/lib---> Running in 3dc4b2664744 Removing intermediate container 3dc4b2664744---> c34ccb48d6c0 Step 7/8 : ENV PATH $PATH:$JAVA_HOME/bin---> Running in dd094c4d0722 Removing intermediate container dd094c4d0722---> 6d9d3ba4b4f0 Step 8/8 : ENTRYPOINT ["java","-cp","lib/*:test.jar","jast.temp.PrintInfo"]---> Running in 7c22e3aa6764 Removing intermediate container 7c22e3aa6764---> ab512eecb1b7 Successfully built ab512eecb1b7 Successfully tagged jast-test-docker:latest查看鏡像
[root@test16 jast-springboot-docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jast-test-docker latest ab512eecb1b7 3 minutes ago 638MB jast-centos 0.0.1 0eb128178c9e 3 hours ago 336MB直接運行鏡像,直接輸出我們java程序中打印的內容
[root@test16 jast-springboot-docker]# docker run -it jast-test-docker Fri Oct 22 06:41:19 UTC 2021 Fri Oct 22 06:41:20 UTC 2021 Fri Oct 22 06:41:21 UTC 2021 Fri Oct 22 06:41:22 UTC 2021 Fri Oct 22 06:41:23 UTC 2021 Fri Oct 22 06:41:24 UTC 2021這里發現我們直接是打印的日志,我們稍微改動一下,讓java程序在后臺運行,日志輸出到我們Linux服務器中
修改下配置文件
FROM centosADD jdk-8u311-linux-x64.tar.gz /optCOPY app /opt/appWORKDIR /opt/appENV JAVA_HOME /opt/jdk1.8.0_311 ENV CLASSPATH .:$CLASSPATH:$JAVA_HOME/lib ENV PATH $PATH:$JAVA_HOME/binVOLUME ["/opt/app/logs"]ENTRYPOINT ["sh","run.sh"]run.sh內容為,可以通過腳本run.sh啟動多個進程,但是必須有一個前臺運行的進程,否則docker啟動后會自動停止,這里我們使用的是tial -f
[root@test16 jast-springboot-docker]# cd app/ [root@test16 app]# ls lib logs run.sh test.jar [root@test16 app]# cat run.sh nohup java -cp lib/*:test.jar jast.temp.PrintInfo > logs/result.log & tail -f logs/result.logbuild
docker build -t jast-test-docker:0.1.0 .運行
查看我們掛載的日志目錄
[root@test16 jast-springboot-docker]# docker inspect 8f06b7834337 ... "Mounts": [{"Type": "volume","Name": "69ff1b332431a43e202cc0eb089b49f9944be5be88cc24a4b259f3606f693c21","Source": "/var/lib/docker/volumes/69ff1b332431a43e202cc0eb089b49f9944be5be88cc24a4b259f3606f693c21/_data","Destination": "/opt/app/logs","Driver": "local","Mode": "","RW": true,"Propagation": ""}]查看Linux掛載出來的目錄下的日志
[root@test16 app]# tailf /var/lib/docker/volumes/69ff1b332431a43e202cc0eb089b49f9944be5be88cc24a4b259f3606f693c21/_data/result.log Fri Oct 22 08:03:05 UTC 2021 Fri Oct 22 08:03:06 UTC 2021 Fri Oct 22 08:03:07 UTC 2021 Fri Oct 22 08:03:08 UTC 2021 Fri Oct 22 08:03:09 UTC 2021 Fri Oct 22 08:03:10 UTC 2021 Fri Oct 22 08:03:11 UTC 2021 Fri Oct 22 08:03:12 UTC 2021 Fri Oct 22 08:03:13 UTC 2021 Fri Oct 22 08:03:14 UTC 2021 Fri Oct 22 08:03:15 UTC 2021進入容器查看容器內result.log日志,發現相同,說明我們創建成功。
[root@test16 app]# docker exec -it 8f06b7834337 /bin/bash [root@8f06b7834337 app]# ls lib logs run.sh test.jar [root@8f06b7834337 app]# tail -f logs/result.log Fri Oct 22 08:05:01 UTC 2021 Fri Oct 22 08:05:02 UTC 2021 Fri Oct 22 08:05:03 UTC 2021 Fri Oct 22 08:05:04 UTC 2021 Fri Oct 22 08:05:05 UTC 2021 Fri Oct 22 08:05:06 UTC 2021 Fri Oct 22 08:05:07 UTC 2021 Fri Oct 22 08:05:08 UTC 2021 Fri Oct 22 08:05:09 UTC 2021 Fri Oct 22 08:05:10 UTC 2021 Fri Oct 22 08:05:11 UTC 2021發布鏡像
發布鏡像到DockerHub
發布本地的鏡像
本地我們鏡像命名可能會不規范,發布時想重新命名進行發布到DockerHub我們可以使用docker tag命令
格式
docker tag $IMAGEID $新的標簽[:版本]
docker tag 66c054090a43 jast/tag:1.0
登錄
(需要先進行賬號注冊,地址:https://hub.docker.com)
發布
docker push jast/tag:1.0發布鏡像到阿里云容器服務
2. 創建鏡像倉庫
登錄阿里云Docker Registry
$ docker login --username=tb7****6464 registry.cn-hangzhou.aliyuncs.com用于登錄的用戶名為阿里云賬號全名,密碼為開通服務時設置的密碼。
您可以在訪問憑證頁面修改憑證密碼。
登錄成功
[root@test16 ~]# docker login --username=username registry.cn-hangzhou.aliyuncs.com Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeededpush鏡像到阿里云倉庫
官方介紹如下
實際操作
[root@test16 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jast-test-docker 0.1.0 66c054090a43 2 hours ago 638MB [root@test16 ~]# docker tag 66c054090a43 registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 [root@test16 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jast-test-docker 0.1.0 66c054090a43 2 hours ago 638MB registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test 0.0.1 66c054090a43 2 hours ago 638MB# 上傳到阿里云倉庫 [root@test16 ~]# docker push registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test] 27b2dc42c067: Pushed 7e28f1f4e30c: Pushed 74ddd0ec08fa: Pushed 0.0.1: digest: sha256:20d452aa1528bb8e1f236781a74b9e5e4af657470dfb6936af6dbc827923c5aa size: 954在阿里云上查看鏡像
發現成功上傳
在Linux服務器上拉取鏡像
官方介紹
實際拉取操作,可以看到我們拉取回來的鏡像
[root@test16 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 0.0.1: Pulling from jast-zsh/jast-test a1d0c7532777: Already exists 56ca049bf4be: Already exists 524200aa718d: Already exists Digest: sha256:20d452aa1528bb8e1f236781a74b9e5e4af657470dfb6936af6dbc827923c5aa Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 [root@test16 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test 0.0.1 66c054090a43 2 hours ago 638MB自定義網絡
查看所有docker網絡
[root@test16 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cadbbb004519 bridge bridge local e678c05db7a8 host host local d83c97dd3227 none null local網絡模式
| bridge | 橋接 docker默認 |
| none | 不配置網絡 |
| host | 和宿主機共享網絡 |
| container | 容器內網絡互連 |
正常我們一臺服務器兩個不同容器之間可以通過ip ping通,但是無法ping 通服務器host(可以通過–link進行連接,一般不使用該方法比較麻煩);我們通過自己創建網絡進行互聯
創建網絡
# 這里設置盡量設置一個不常用的ip,測試時候我使用了192.168.0.0/16,直接導致服務器網絡連接不上,估計是沖突了~ [root@test16 ~]# docker network create --driver bridge --subnet 192.160.0.0/16 --gateway 192.160.0.1 mynet 3f0facb7582af42f42acb8e59c4bcc254d57de9425d8d7433beea00d92fcc52cdocker查看所有網絡
[root@test16 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cadbbb004519 bridge bridge local e678c05db7a8 host host local 3f0facb7582a mynet bridge local d83c97dd3227 none null local查看創建的網絡詳情
[root@test16 ~]# docker network inspect mynet [{"Name": "mynet","Id": "3f0facb7582af42f42acb8e59c4bcc254d57de9425d8d7433beea00d92fcc52c","Created": "2021-10-22T20:58:28.703557023+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "192.160.0.0/16","Gateway": "192.160.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}} ]創建兩個鏡像并使用我們自己創建的網絡
[root@test16 ~]# docker run -d -P --name jast-net-01 --net mynet registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 6703b0bd420cc0c1c63a27a23a5d18dbef7534f5a90cb6d54c6b2bde494dd0f8 [root@test16 ~]# docker run -d -P --name jast-net-02 --net mynet registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 db3c9bf811cc5b111e95d3250f762ecaad75464f16722dc80b3f2ae4047c31a4此時我們使用tomcate-net-01 可以直接通過host ping tomcat-net-02
[root@test16 ~]# docker exec -it jast-net-02 ping jast-net-01 PING jast-net-01 (192.160.0.5) 56(84) bytes of data. 64 bytes from jast-net-01.mynet (192.160.0.5): icmp_seq=1 ttl=64 time=0.047 ms 64 bytes from jast-net-01.mynet (192.160.0.5): icmp_seq=2 ttl=64 time=0.049 ms --- jast-net-01 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.047/0.048/0.049/0.001 ms [root@test16 ~]# docker exec -it jast-net-01 ping jast-net-02 PING jast-net-02 (192.160.0.6) 56(84) bytes of data. 64 bytes from jast-net-02.mynet (192.160.0.6): icmp_seq=1 ttl=64 time=0.034 ms 64 bytes from jast-net-02.mynet (192.160.0.6): icmp_seq=2 ttl=64 time=0.062 ms --- jast-net-02 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.034/0.048/0.062/0.014 ms多個自定義網絡連通
問題:我們創建mynet,在mynet網絡下的服務都是網絡互通,如果我們再創建myent2。mynet與mynet2如何連通?
network connect 連通
創建兩個連接默認網絡的鏡像
[root@test16 ~]# docker run -d -P --name jast-01 registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 da7e002a63148a5a9cf930bce4643bfcb0b7ad2d7d02e9928c5405c35b892173 [root@test16 ~]# docker run -d -P --name jast-02 registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 c40f3f5afa686160142b15321a1c334e5bd017dde5e3611aab1ab0b88ce21f86此時我們有四個容器在運行
[root@test16 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c40f3f5afa68 registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 "sh run.sh" About a minute ago Up About a minute jast-02 da7e002a6314 registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 "sh run.sh" About a minute ago Up About a minute jast-01 db3c9bf811cc registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 "sh run.sh" 7 minutes ago Up 7 minutes jast-net-02 6703b0bd420c registry.cn-hangzhou.aliyuncs.com/jast-zsh/jast-test:0.0.1 "sh run.sh" 7 minutes ago Up 7 minutes jast-net-01此時用jast-01 ping jast-net-01是不通的
[root@test16 ~]# docker exec -it jast-01 ping jast-net-01 ping: jast-net-01: Name or service not known使用connect連接
[root@test16 ~]# docker network connect --helpUsage: docker network connect [OPTIONS] NETWORK CONTAINERConnect a container to a networkOptions:--alias strings Add network-scoped alias for the container--driver-opt strings driver options for the network--ip string IPv4 address (e.g., 172.30.100.104)--ip6 string IPv6 address (e.g., 2001:db8::33)--link list Add link to another container--link-local-ip strings Add a link-local address for the container docker network connect mynet jast-01連通之后查看我們的網絡信息
[root@test16 ~]# docker network inspect mynet發現jast-01 已經在我們mynet網絡下
再次ping,發現網絡已經通了
實戰
Docker 配置Redis集群
我們要搭建的Redis集群為三主三從
進入容器內部,執行redis-cli 命令初始化創建集群
創建成功,查看集群信息
127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:2 cluster_stats_messages_ping_sent:126 cluster_stats_messages_pong_sent:122 cluster_stats_messages_meet_sent:1 cluster_stats_messages_sent:249 cluster_stats_messages_ping_received:122 cluster_stats_messages_pong_received:127 cluster_stats_messages_received:249 127.0.0.1:6379> cluster nodes 2043ae4e89512f7a532e5ac6bacab9b7e32fb36d 192.150.0.13:6379@16379 master - 0 1634952993167 3 connected 10923-16383 9393eacec8f654913952819e6181d929a9536dc8 192.150.0.14:6379@16379 slave 2043ae4e89512f7a532e5ac6bacab9b7e32fb36d 0 1634952992000 3 connected 617a0c5fbba78c083f277f74cd799413a03c4c8c 192.150.0.12:6379@16379 master - 0 1634952992666 2 connected 5461-10922 2b1b770fcf8dd5cb230d0562aa17207d43e97587 192.150.0.11:6379@16379 master - 0 1634952992000 1 connected 0-5460 018099d52339c4c417316027dcb7a7e8ee8ff930 192.150.0.15:6379@16379 slave 2b1b770fcf8dd5cb230d0562aa17207d43e97587 0 1634952992164 1 connected 7c82f60bd2586d2c7249237d1e0383d82627a136 192.150.0.16:6379@16379 myself,slave 617a0c5fbba78c083f277f74cd799413a03c4c8c 0 1634952991000 2 connected驗證數據寫入讀取
127.0.0.1:6379> set k1 v1 -> Redirected to slot [12706] located at 192.150.0.13:6379 OK 192.150.0.13:6379> get k1 "v1" 192.150.0.13:6379> set k2 v2 -> Redirected to slot [449] located at 192.150.0.11:6379 OK 192.150.0.11:6379> get k1 -> Redirected to slot [12706] located at 192.150.0.13:6379 "v1" 192.150.0.13:6379> get k2 -> Redirected to slot [449] located at 192.150.0.11:6379 "v2"驗證集群
可以在上面set的k1發現,k1保存在了192.168.0.13docker容器上,我們把192.168.0.13停止,再試一下是否能讀取成功。
停止之后我們再次get k1,發現從14上獲取到了該信息,說明我們集群設置成功
192.150.0.11:6379> get k1 -> Redirected to slot [12706] located at 192.150.0.14:6379 "v1"在集群的節點信息中也可以看到13停止服務,master切換到了14
192.150.0.14:6379> cluster nodes 2043ae4e89512f7a532e5ac6bacab9b7e32fb36d 192.150.0.13:6379@16379 master,fail - 1634953189076 1634953186565 3 connected 9393eacec8f654913952819e6181d929a9536dc8 192.150.0.14:6379@16379 myself,master - 0 1634953282000 7 connected 10923-16383 018099d52339c4c417316027dcb7a7e8ee8ff930 192.150.0.15:6379@16379 slave 2b1b770fcf8dd5cb230d0562aa17207d43e97587 0 1634953285000 1 connected 617a0c5fbba78c083f277f74cd799413a03c4c8c 192.150.0.12:6379@16379 master - 0 1634953286400 2 connected 5461-10922 7c82f60bd2586d2c7249237d1e0383d82627a136 192.150.0.16:6379@16379 slave 617a0c5fbba78c083f277f74cd799413a03c4c8c 0 1634953286000 2 connected 2b1b770fcf8dd5cb230d0562aa17207d43e97587 192.150.0.11:6379@16379 master - 0 1634953285397 1 connected 0-5460 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Docker入门到精通开发指南(一文搞懂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: output.properties da
- 下一篇: HugeGraph 配置参数