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