1.參考資料
官方文檔:https://docs.docker.com/docker-for-windows/
倉庫地址:https://hub.docker.com/
2.Docker 的安裝
2.1.docker的組成部分
-
鏡像(image):docker鏡像好比一個模板,可以通過這個模板來創建容器(container),一個鏡像可以創建多個容器,類似java中的Class
-
容器(container):類似java中通過Class創建的實例;容器可以理解為一個簡易的linux系統
-
倉庫(repository):存放鏡像的地方,
分為共有倉庫和私有倉庫
-
Docker Hub:國外的
-
阿里雲:配置鏡像加速
-
2.2.環境准備
我們要有一台服務器,並且可以操作它
-
Linux命令基礎
-
CentOS 7
-
使用Xshell鏈接遠程服務器(免費版即可)
2.3. 安裝docker
https://docs.docker.com/engine/install/centos/
卸載舊的版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安裝基本的安裝包
$ sudo yum install -y yum-utils
設置鏡像的倉庫
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默認是國外的
$ sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里雲鏡像
安裝docker引擎
yum makecache fast
安裝docker引擎
yum install docker-ce docker-ce-cli containerd.io # docker-ce 社區版 ee 企業版
CentOS 8中安裝Docker出現和Podman沖突
yum erase podman buildah
繼續執行安裝即可
2.4.啟動docker
systemctl start docker # 代表啟動成功
docker version
docker run hello-world
docker images
2.5.卸載Docker
# 卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
# 刪除資源
rm -rf /var/lib/docker # docker 的默認工作路徑
3.docker 常用命令
以上已經用到了一些相關命名下面整體介紹一下。
命令參考地址:
https://docs.docker.com/engine/reference/commandline/docker/
3.1. 全局命令
docker version # 顯示docker的基本信息
docker info # 系統信息,鏡像和容器的數量
docker 命令 --help # 全部信息
3.2.鏡像命令
3.2.1.docker images
docker images # 查看所有本地主機上的鏡像
--all , -a Show all images (default hides intermediate images) # 顯示所有
--digests Show digests
--filter , -f Filter output based on conditions provided
--format Pretty-print images using a Go template
--no-trunc Don’t truncate output
--quiet , -q Only show numeric IDs # 只顯示id
3.2.2. docker search
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
3.2.3.docker pull
docker pull mysql # 下載mysql鏡像,default tag,默認最新版latest
# 指定版本下載
docker pull mysql:5.7
分層下載的好處是:不同的版本相同的部分不用重新下載。
3.2.4. docker rmi
# 刪除一個 可以通過名稱 也可以指定id -f表示刪除所有
docker rmi -f d1165f221234
# 刪除多個 用空格分隔id
docker rmi -f id id id
# 刪除所有
docker rmi -f $(docker images -aq) # images -aq就是查所有鏡像id,從而遞歸刪除
3.2.容器命令
有了鏡像才能創建容器,linux,下載一個centos鏡像來測試學習
3.2.1.新建容器並啟動
docker run [可選參數] image
# 參數說明
# --name=“Name” # 容器名字,用於區分容器
# -it 使用交互方式運行,進入容器查看內容
# -d 后台運行
# -p 端口映射 主機端口::容器端口
# -v 卷掛載
# -e 配置
# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
3.2.2.進入容器
docker exec -it 1de87c606832 /bin/bash
# docker attach 1de87c606832
區別
docker exec # 進入容器后開啟一個新的終端,可以在里面操作(常用)
docker attach 進入容器正在執行的終端,不會啟動新的進程
# 查看目錄
ls
3.2.3.查看容器
# 查看正在運行的容器
docker ps
# 查看曾經運行的容器
docker ps -a
# 顯示最近創建的容器,設置顯示個數
docker ps -a - n=?
# 只顯示容器的編號
docker ps -aq
3.2.4.退出容器
# 容器停止退出
exit
# 容器不停止退出 注意必須在英文輸入法下,中文輸入法不行
Ctrl + P + Q
3.2.5.刪除容器
# 刪除指定容器 不能刪除正在運行的容器,如果強制刪除 rm -f
docker rm 容器id
# 刪除所有容器
docker rm -f $(docker ps -aq)
# 刪除所有容器
docker ps -a -q|xargs docker rm
3.2.6.導入導出
docker export $CONTAINER_ID > ubuntu.tar
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
3.2.7.自動重啟
docker run --restart=always 容器id(或者容器名稱)
#no - container:不重啟
#on-failure - container:退出狀態非0時重啟
#always:始終重啟
docker update --restart=always 容器id(或者容器名稱)
3.2.8.相關狀態
docker start $CONTAINER_ID
docker restart $CONTAINER_ID
docker stop $CONTAINER_ID
docker kill $CONTAINER_ID
3.3.常用其他命令
3.3.1.后台啟動docker
docker run -d 鏡像名
# 用docker ps 查看的時候 發現停止了
# 后台運行,docker發現前台沒有,容器啟動后,發現自己沒有提供服務,會立刻停止
3.3.2.查看日志
docker logs
docker logs -f --tail=20 $CONTAINER_ID #查看最新20行
3.3.3.查看容器信息
docker inspect $CONTAINER_ID
3.3.4.文件copy
容器copy 到主機
docker cp $CONTAINER_ID:路徑 空格 主機路徑
docker cp 83b0be074d94:/etc/mysql /home
主機copy 到容器
docker cp 主機路徑 空格 $CONTAINER_ID:路徑
后面我們會遇到 卷
3.3.5.任務管理器
docker stats
4.容器數據卷
在Docker中,要想實現數據的持久化,數據就不應該在容器中,否則容器刪除,數據就會丟失。故容器之間要有一個數據共享技術,把Docker容器中產生的數據,同步到本地,這就是卷技術。
優點
-
容器的持久化和同步操作
-
容器間可以數據共享
4.1.使用數據卷
目前Docker提供了三種不同的方式將數據從宿主機掛載到容器中:
(1)volumes:Docker管理宿主機文件系統的一部分,默認位於 /var/lib/docker/volumes 目錄中;(最常用的方式)
(2)bind mounts:意為着可以存儲在宿主機系統的任意位置;(比較常用的方式)
但是,bind mount在不同的宿主機系統時不可移植的,比如Windows和Linux的目錄結構是不一樣的,bind mount所指向的host目錄也不能一樣。這也是為什么bind mount不能出現在Dockerfile中的原因,因為這樣Dockerfile就不可移植了。
(3)tmpfs:掛載存儲在宿主機系統的內存中,而不會寫入宿主機的文件系統;(一般都不會用的方式)
4.1.1.命令掛載
docker run -it -v -p /宿主機絕對路徑:/容器內目錄:權限 鏡像名
# -it 交互式進入
# -v volume卷技術
# -p 主機端口
# 掛載
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
-d 后台運行
-p 端口映射
-v 卷掛載
-e 環境配置 安裝啟動mysql需要配置密碼
--name 容器名字
主機目錄/home/mysql/conf與/etc/mysql/conf容器目錄同步。
查看其信息
soruce:主機地址
destination:容器地址
4.1.2.匿名與具名掛載
匿名掛載:卷掛載只寫容器里面的路徑,不寫容器外的路徑。
# -v 容器內路徑
docker run -d -P --name nginx01 -v /etc/nginx nginx
具名掛載:就是掛載的卷陪一個自己的名字,可以方便的查找
# -v 卷名:/容器內路徑
docker run -d -P --name nginx01 -v wyl-nginx:/etc/nginx nginx
docker inspect 6d4a76d84a35
4.1.3.查看卷信息
docker volume inspect wyl-nginx
4.1.4.改變文件的讀寫權限
# ro: readonly
# rw: readwrite
# 指定容器對我們掛載出來的內容的讀寫權限
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:rw nginx
4.2.查看所有的數據卷
docker volume ls
4.3.共享卷
docker run -it --name nginx03 --volumes-from nginx02 nginx:latest
nginx03繼承nginx02的volumes
可以驗證,在nginx02下加一個數據,在nginx03下也會出現
刪除容器共享文件不會刪除。
5.dockerFile
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
5.1.命令
FROM # 基礎鏡像 比如centos
MAINTAINER # 鏡像是誰寫的 姓名+郵箱
RUN # 鏡像構建時需要運行的命令
ADD # 添加,比如添加一個tomcat壓縮包
WORKDIR # 鏡像的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 指定暴露端口,跟-p一個道理
RUN # 最終要運行的
CMD # 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,而且可被替代
ENTRYPOINT # 指定這個容器啟動的時候要運行的命令,可以追加命令
ONBUILD # 當構建一個被繼承Dockerfile 這個時候運行ONBUILD指定,觸發指令
COPY # 將文件拷貝到鏡像中
ENV # 構建的時候設置環境變量
5.2.創建centos
5.2.1.創建dockerfile
# 進入home目錄
cd /home
# 創建一個目錄,之后的東西都保存到這里
mkdir dockerfile
# 進入這個目錄
cd dockerfile/
# 創建一個dockerfile,名字叫mydockerfile
vim mydockerfile-centos
FROM centos
MAINTAINER wyl<1714404171@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 8088
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
5.2.2.docker build
cd /home/docerfile
docker build -t mycentos -f mydockerfile-centos .
后面的點不要忘記
6.Docker Compose
前面我們使用 Docker 的時候,定義 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,那么效率之低,維護量之大可想而知.對此我們就可以來學習一下docker compose
它是一個用於定義和運行多容器 Docker 的應用程序工具
6.1. compose安裝
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
or
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
pip安裝
sudo pip install docker-compose
6.2.權限
sudo chmod +x /usr/local/bin/docker-compose
6.3.Compose 使用
三個步驟:
-
使用 Dockerfile 定義應用程序的環境。
FROM java:8 VOLUME /tmp ADD docker-demo.jar app.jar RUN bash -c 'touch /app.jar' EXPOSE 9000 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
-
使用 docker-compose.yml 定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行。
Compose和Docker兼容性: Compose 文件格式有3個版本,分別為1, 2.x 和 3.x 目前主流的為 3.x 其支持 docker 1.13.0 及其以上的版本 常用參數: version # 指定 compose 文件的版本 services # 定義所有的 service 信息, services 下面的第一級別的 key 既是一個 service 的名稱 build # 指定包含構建上下文的路徑, 或作為一個對象,該對象具有 context 和指定的 dockerfile 文件以及 args 參數值 context # context: 指定 Dockerfile 文件所在的路徑 dockerfile # dockerfile: 指定 context 指定的目錄下面的 Dockerfile 的名稱(默認為 Dockerfile) args # args: Dockerfile 在 build 過程中需要的參數 (等同於 docker container build --build-arg 的作用) cache_from # v3.2中新增的參數, 指定緩存的鏡像列表 (等同於 docker container build --cache_from 的作用) labels # v3.3中新增的參數, 設置鏡像的元數據 (等同於 docker container build --labels 的作用) shm_size # v3.5中新增的參數, 設置容器 /dev/shm 分區的大小 (等同於 docker container build --shm-size 的作用) command # 覆蓋容器啟動后默認執行的命令, 支持 shell 格式和 [] 格式 configs # cgroup_parent # container_name # 指定容器的名稱 (等同於 docker run --name 的作用) credential_spec # deploy # v3 版本以上, 指定與部署和運行服務相關的配置, deploy 部分是 docker stack 使用的, docker stack 依賴 docker swarm endpoint_mode # v3.3 版本中新增的功能, 指定服務暴露的方式 vip # Docker 為該服務分配了一個虛擬 IP(VIP), 作為客戶端的訪問服務的地址 dnsrr # DNS輪詢, Docker 為該服務設置 DNS 條目, 使得服務名稱的 DNS 查詢返回一個 IP 地址列表, 客戶端直接訪問其中的一個地址 labels # 指定服務的標簽,這些標簽僅在服務上設置 mode # 指定 deploy 的模式 global # 每個集群節點都只有一個容器 replicated # 用戶可以指定集群中容器的數量(默認) placement # replicas # deploy 的 mode 為 replicated 時, 指定容器副本的數量 resources # 資源限制 limits # 設置容器的資源限制 cpus: "0.5" # 設置該容器最多只能使用 50% 的 CPU memory: 50M # 設置該容器最多只能使用 50M 的內存空間 reservations # 設置為容器預留的系統資源(隨時可用) cpus: "0.2" # 為該容器保留 20% 的 CPU memory: 20M # 為該容器保留 20M 的內存空間 restart_policy # 定義容器重啟策略, 用於代替 restart 參數 condition # 定義容器重啟策略(接受三個參數) none # 不嘗試重啟 on-failure # 只有當容器內部應用程序出現問題才會重啟 any # 無論如何都會嘗試重啟(默認) delay # 嘗試重啟的間隔時間(默認為 0s) max_attempts # 嘗試重啟次數(默認一直嘗試重啟) window # 檢查重啟是否成功之前的等待時間(即如果容器啟動了, 隔多少秒之后去檢測容器是否正常, 默認 0s) update_config # 用於配置滾動更新配置 parallelism # 一次性更新的容器數量 delay # 更新一組容器之間的間隔時間 failure_action # 定義更新失敗的策略 continue # 繼續更新 rollback # 回滾更新 pause # 暫停更新(默認) monitor # 每次更新后的持續時間以監視更新是否失敗(單位: ns|us|ms|s|m|h) (默認為0) max_failure_ratio # 回滾期間容忍的失敗率(默認值為0) order # v3.4 版本中新增的參數, 回滾期間的操作順序 stop-first #舊任務在啟動新任務之前停止(默認) start-first #首先啟動新任務, 並且正在運行的任務暫時重疊 rollback_config # v3.7 版本中新增的參數, 用於定義在 update_config 更新失敗的回滾策略 parallelism # 一次回滾的容器數, 如果設置為0, 則所有容器同時回滾 delay # 每個組回滾之間的時間間隔(默認為0) failure_action # 定義回滾失敗的策略 continue # 繼續回滾 pause # 暫停回滾 monitor # 每次回滾任務后的持續時間以監視失敗(單位: ns|us|ms|s|m|h) (默認為0) max_failure_ratio # 回滾期間容忍的失敗率(默認值0) order # 回滾期間的操作順序 stop-first # 舊任務在啟動新任務之前停止(默認) start-first # 首先啟動新任務, 並且正在運行的任務暫時重疊 注意: 支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子選項 security_opt container_name devices tmpfs stop_signal links cgroup_parent network_mode external_links restart build userns_mode sysctls devices # 指定設備映射列表 (等同於 docker run --device 的作用) depends_on # 定義容器啟動順序 (此選項解決了容器之間的依賴關系, 此選項在 v3 版本中 使用 swarm 部署時將忽略該選項)
-
最后,執行 docker-compose up 命令來啟動並運行整個應用程序。
docker-compose up docker-compose up -d // 后台啟動並運行容器
6.3.卸載
# pip卸載
pip uninstall docker-compose
6.4.常用命令
7.docker network
默認情況下容器與容器、容器與宿主機的網絡是隔離開來的,
當你安裝docker的時候,docker會創建一個橋接器docker0,通過它才讓容器與容器、容器與宿主機之間通信。
Docker安裝的時候默認會創建三個不同的網絡,你可以通過命令查看這些網絡。
docker network ls
#幫助命令后顯示下面信息
[root@vultrguest ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Options:
--help Print usage
Commands:
connect 將某個容器連接到一個docker網絡
create 創建一個docker局域網絡
disconnect 將某個容器退出某個局域網絡
inspect 顯示某個局域網絡信息
ls 顯示所有docker局域網絡
prune 刪除所有未引用的docker局域網絡
rm 刪除docker網絡
Run 'docker network COMMAND --help' for more information on a command.
7.1.默認網絡
7.1.1.None Network
網絡模式為none的,即不會為容器創建任何的網絡環境。
一旦Docker Container采用了none網絡模式,那么容器內部就只能使用loopback網絡設備,不會再有其他的網絡資源。
7.1.2.Host Network
如果你在創建容器的時候使用--network=host
選項,那么容器會使用宿主機的網絡,容器與宿主機的網絡並沒有隔離。
使用這種網絡類型的好處就是網絡性能很好,基本上跟宿主機的網絡一樣,它很大的弊端就是不安全。
你可以在容器中更改宿主機的網絡,如果你的程序是用root用戶運行的,有可能會通過Docker容器來控制宿主機的網絡。
當我們在容器中執行類似ifconfig命令查看網絡環境是,看到的都是宿主機上的信息。
7.1.3.Bridge Network
橋接網絡是默認的網絡類型,我們可以使用下面的命令來查看默認的網絡配置信息。
這兒橋接的網絡名為docker0
。當我們啟動一個容器的時候,每個容器會有它自己的虛擬網絡接口連接到docker0
,並獲得一個IP地址。
7.2.自定義網絡
7.2.1創建網絡
docker network create mynet
7.2.2.把容器加入局域網
#運行redis容器
docker run -itd --name redis --network mynet --network-alias redis -p 6379:6379 redis
#運行nginx容器
docker run -d --name nginx -p 8081:8081 --network mynet --network-alias nginx --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx
7.2.3.查看mynet 信息
7.2.4.docker network connect
也可以不指定網絡,直接啟動容器,然后使用docker network connect接入網絡
docker network connect mynet nginx
docker network connect mynet redis
7.2.5.移除局域網
docker network disconnect mynet nginx