最詳細的 docker 隨手記
前言
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
博主在學習工作中,使用docker總結了一點心得,這裏將其整理記錄下來,供自己和大家參考。
一、docker 環境搭建
1、環境準備
docker 官方建議基於 ubuntu
進行安裝與使用。
如果你使用的是 centOS
系統,建議使用 centOS7.x
,即內核版本爲3.1
及其以上。
如果你使用的是 centOS6.x
,由於內核版本較低,有些特性無法使用,需要先升級系統內核。這裏請自行百度,這裏就不再贅述。
博主這裏使用的是centOS7
進行安裝。
centOS7
鏡像下載地址:阿里雲 centOS7鏡像下載.
1.1、yum 包更新
安裝好鏡像後啓動,先更新 yum 庫
sudo yum update
1.2、安裝依賴
yum-util 提供 yum-config-manager功能,另外兩個是 devicemapper驅動依賴的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
1.3、設置yum源爲阿里雲
設置源爲阿里雲,後面下載速度會快很多
# 備份原文件
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 修改yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
補充:關閉防火牆
如果遇到一些網絡問題或其他問題,可嘗試關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
2、docker安裝
2.1 下載安裝
docker-ce 社區版
docker-ee 企業版
sudo yum install -y docker-ce
2.2 docker版本檢查
安裝完成後,檢查docker版本
docker -v
3、docker啓動
3.1 啓動
# centos 7.x
systemctl start docker
# centos 6.x
service docker start
3.2 開機啓動
systemctl enable docker
3.3 重啓
# centos 7.x
systemctl restart docker
# centos 6.x
sudo service docker restart
3.4 關閉
# centos 7.x
systemctl stop docker
# centos 6.x
service docker stop
3.5 檢查
docker ps -a
systemctl status docker
4、docker 鏡像源設置
ustc是老牌的linux鏡像提供者。ustc的docker鏡像加速器速度很快。ustc docker mirror的優勢之一就是無需註冊,是真正的公共服務器。
- 先啓動docker,此時系統會自動生成
/etc/docker
文件夾 - 在
/etc/docker
下創建並編輯daemon.json
文件
輸入如下內容(指定鏡像下載地址)vi /etc/docker/daemon.json
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
注意:如果 daemon.json 配置不生效
# 修改 docker.service 配置文件
vi /lib/systemd/system/docker.service
# 添加如下內容(在 ExecReload=/bin/kill -s HUP $MAINPID 之下添加)
EnvironmentFile=-/etc/docker/daemon.json
# 重啓docker
systemctl restart docker
二、docker常用命令
1、基本信息
# 基本信息查看
docker info
# 幫助
docker -h/--help
# 版本
docker -v/--version
2、鏡像相關命令
2.1 查看本地鏡像
鏡像存在docker宿主機的 /var/lib/docker
目錄下
第一次安裝docker時,本地是沒有鏡像的,可以通過下面的指令查看本地鏡像
# 查看本地鏡像
docker images
# -q 查出所有鏡像ID
docker images -q
REPOSITORY TAG IMAGE ID CREATED SIZE
鏡像名稱 鏡像標籤 鏡像ID 鏡像的創建時間 鏡像大小
2.2 搜索鏡像
從網絡中獲取鏡像
docker search 鏡像名
docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
倉庫名稱 鏡像描述 用戶評價 是否官方 自動構建(表示該鏡像是否由Docker Hub自動構建流程創建的)
2.3 拉取鏡像
從中央倉庫中下載鏡像到本地
前面設置 ustc 鏡像倉庫加速器,便是爲了提高鏡像下載速度
docker pull 鏡像名
docker pull centos:7
2.4 刪除鏡像
按鏡像ID(或鏡像名)刪除鏡像
docker rmi 鏡像ID(或鏡像名:tag)
docker rmi 5e35e350aded(centos:7)
刪除所有鏡像
docker rmi `docker images -q`
3、容器相關命令
3.1 查看容器
# 查看正在運行的容器
docker ps
# 查看所有容器
docker ps -a
# 查看最後一次運行的容器
docker ps -l
# 查看停止的容器
docker ps -f status=exited
3.2 創建與啓動容器
docker run
--restart=alwarys:docker重啓的時候,此容器一起啓動
-i : 運行容器
-t : 容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登陸進去,即分配一個僞終端
-d : 表示創建一個守護式容器在後臺運行(不會自動分配僞終端)
--name : 爲創建的容器命名(需要賦值: --name=redis)
-v : 表示目錄映射關係(前者是宿主機目錄,後者是映射到容器內的目錄)可以使用多個-v映射多個目錄或文件。
注意:最好做目錄映射 在宿主機上做修改,然後共享到容器上。
-p : 端口映射(前者是宿主機端口,後者是容器內的映射端口)可以使用多個-p映射多個端口
- 交互式方式創建容器
退出當前容器,會導致當前容器停止docker run -it --name=centos7 centos:7 /bin/bash
exit
- 守護式方式創建容器
登陸守護式容器方式docker run -di --name=centos7 centos:7
# 退出時,不會導致容器停止(推薦使用) docker exec -it 容器id /bin/bash # 退出時,會退出時,不會 docker attach 容器id
- 映射方式創建容器
# 使用鏡像 nginx:latest,以後臺模式啓動一個容器 # 將容器的 80 端口映射到主機的 90 端口 # 主機的目錄 /opt 映射到容器的 /data。 docker run -p 90:80 -v /opt:/data -d nginx:latest
3.3 停止與啓動容器
- 停止容器
docker stop 容器名(或容器ID)
- 啓動容器
docker start 容器名(或容器ID)
- 重啓容器
docker restart 容器名(或容器ID)
3.4 文件拷貝
- 從宿主機拷貝文件到容器
docker cp 宿主機上待拷貝的文件或目錄 容器名稱:容器目錄
- 從容器拷貝文件到宿主機
docker cp 容器名稱:容器目錄 宿主機上待拷貝的文件或目錄
3.5 目錄掛載
將宿主機目錄掛載到容器。從而達到修改宿主機文件而影響容器
# 宿主機目錄:容器目錄
docker run -di -v /opt/test:/opt/vtest --name=centos-20200319-1700 centos:7
如果共享多級目錄,可能會出現權限不足提示
因爲CentOS7
中的安全模塊selinux
把權限禁掉了。我們需添加參數 --privlleged=true
來解決
3.6 查看容器IP地址
docker inspect 容器名(或容器ID)
docker inspect --format ='{{.NetworkSettings.IPAddress}}' 容器名(或容器ID)
3.7 刪除容器
docker rm 容器名(或容器ID)
3.8 查看容器日誌
docker logs -f 457f9d9c6bde --tail=500
3.9 設置容器伴隨Docker服務啓動
docker container update --restart=always 容器名(或容器ID)
三、常用應用部署
1、MySQL部署
- 拉取mysql鏡像
docker pull centos/mysql-57-centos7
- 創建容器
docker run -di --name=mysql-57-p33306 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7 -p: 端口映射。格式:宿主機映射端口:容器運行端口 -e: 添加環境變量。MYSQL_ROOT_PASSWORD 是root用戶的登陸密碼
- 進入mysql容器
docker exec -it mysql-57-p33306 /bin/bash
- 登陸 mysql
# 在容器中執行 mysql -u root -p
- 遠程登陸 mysql
打開遠程連接工具,連接mysql -> 宿主IP:33306
2、tomcat部署
- 拉取tomcat鏡像
docker pull tomcat:7 docker pull tomcat:7-jre7 docker pull tomcat:8 docker pull tomcat:8-jre8
- 創建容器
docker run -di --name=tomcat-8-p9800 -p 9800:8080 -v /opt/tomcat/docker-tomcat/tomcat-8-p9800/webapps:/usr/local/tomcat/webapps tomcat:8 -p: 端口映射。格式:宿主機映射端口:容器運行端口 -v: 目錄掛載。宿主機tomcat-8-jre8-p9801/webapps掛載至/usr/local/tomcat/webapps
- tomcat訪問
# 宿主機IP:映射端口 http://192.168.0.233:9800
注意:訪問前,由於將容器的 webapps掛載到宿主機了,宿主機相應目錄下爲空(即沒有index等頁面)這時訪問會找不到主頁。
解決方法:可將其他tomcat下的wabapps目錄copy至掛載的宿主機目錄下,再次訪問即可。
比如我上面將容器的webapps目錄掛載至宿主機的/opt/tomcat/docker-tomcat/tomcat-8-p9800/webapps/
目錄
3、Nginx部署
- 拉取nginx鏡像
docker pull nginx:1.17.9
- 創建nginx容器
docker run -di --name=nginx-p80 -p 80:80 nginx:1.17.9
- 進入容器
進入nginx容器,查看主配置文件# 進入容器 docker exec -it nginx-p80 /bin/bash # 查看nginx主配置 cat /etc/nginx/nginx.conf # 根據主配置查看導入的默認配置 (默認靜態文件位置 /usr/share/nginx/html) cat /etc/nginx/conf.d/default.conf # 將宿主機靜態文件拷貝至默認文件位置 docker cp /opt/nginx/docker-nginx/public nginx-p80:/usr/share/nginx/html/ # 最後瀏覽器訪問 http://192.168.0.233/public/images/idea3.jpg
根據主配置文件,查找導入的配置文件
將宿主機靜態文件拷貝至默認文件位置
最後瀏覽器訪問nginx的靜態文件
4、Redis部署
- 拉取redis鏡像
docker pull redis
- 創建redis容器
docker run -di --name=redis-p16379 -p 16379:6379 redis
- 遠程連接
或者直接使用redis客戶端管理工具連接# win下,打開CMD窗口,cd到redis-cli.exe同目錄下,利用客戶端連接工具連接 redis-cli -h 192.168.0.233 -p 16379
四、遷移與備份
1、容器保存爲鏡像
# 容器名 保存後的鏡像名
docker commit -a "swotxu" -m "add new_nginx" nginx-p80 nginx_p80:v1.0
2、鏡像備份
# 保存後的文件名 鏡像名
docker save -o nginx-p80-v1_0.tar nginx_p80:v1.0
3、鏡像恢復與遷移
# 將備份的鏡像tar文件,載入docker
docker load -i nginx-p80.tar
-i: 輸入的文件
五、Dockerfile
1、常用命令
命令模板 | 示例 | 解釋 |
---|---|---|
FROM image_name:tag | FROM centos:7 | 定義了使用哪個基礎鏡像啓動構建流程 |
MAINTAINER user_name | MAINTAINER swotxu | 聲明鏡像的創建者 |
ENV key value | ENV env dev | 設置環境變量 |
RUN command | RUN chmod 755 /usr/share/fonts/special/* | 構建時執行指令RUN ["./test.php", “dev”, “offline”] 等價於 RUN ./test.php dev office |
ADD source_dir/file dest_dir/file | ADD office-service-1.0.jar ./ | 將宿主機文件複製到鏡像,若是壓縮文件,會自動解壓 |
COPY source_dir/file dest_dir/file | COPY office-service-1.0.jar ./ | 和ADD相似,但不會自動解壓 |
WORKDIR path_dir | WORKDIR /usr/share/fonts/special/ | 設置工作目錄 |
EXPOSE port | EXPOSE 8082 | 聲明端口 |
CMD command | CMD java $JAVA_OPTS -jar myweb.jar | RUN在docker build時運行CMD在docker run時運行 |
ENTRYPOINT command | ENTRYPOINT java $JAVA_OPTS -jar myweb.jar | 定參,不會被docker run -e時覆蓋 |
更多參數詳情參見: runoob.com.
2、使用腳本創建鏡像
模擬製作 JDK8 鏡像
- 在宿主機創建目錄
/opt/docker/docker-jdk8/
,將 jdk8.tar.gz 壓縮包放入其中 - 創建
Dockerfile
文件
注意:Dockerfile
文件名注意大小寫,文件無後綴
編輯 Dockerfile 文件# cd到當前目錄 cd /opt/docker/docker-jdk8/ # 創建 Dockerfile文件 vi Dockerfile
# 基於centos7鏡像製作 #FROM 192.168.0.233:5000/common/centos7-ext-fonts:v1.0 FROM centos:7 MAINTAINER swotxu #設置工作目錄 WORKDIR /usr #在鏡像中創建文件夾 RUN mkdir /usr/local/java #將宿主機的 jdk.tar 解壓至容器的/usr/local/java/目錄 ADD jdk-8u161-linux-x64.tar.gz /usr/local/java/ # 設置jdk所需環境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_161 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH # 將環境變量寫入系統配置文件 RUN echo 'export JAVA_HOME=/usr/local/java/jdk1.8.0_161' >> /etc/profile RUN echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile RUN echo 'export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile
- 執行命令生成鏡像
docker build -t="jdk1.8" . -t: 指定構建後鏡像名稱 .: 指定當前目錄
- 啓動 jdk1.8
docker run -dt --name=jdk1.8 192.168.0.233:5000/common/jdk1.8:v1.0
- 進入 jdk1.8
docker exec -it jdk1.8 /bin/bash # 測試jdk環境是否安裝成功 Java -version # 退出鏡像 exit
- 導出 jdk1.8鏡像 (將鏡像導出到宿主機本地,此步省略)
docker save -o jdk1.8-v1_0.tar 192.168.0.233:5000/common/jdk1.8:v1.0
- 導入 jdk1.8鏡像 (從宿主機本地導入鏡像,此步省略)
docker load -i jdk1.8-v1_0.tar
六、Docker 私有倉庫
私有倉庫搭建與配置
- 拉取私有倉庫鏡像
docker pull registry
- 啓動私有倉庫容器
啓動私有倉庫時,最好掛載配置文件config.yml
(宿主機新建此配置文件)便於後面對私有倉庫中鏡像的修改# 方式一:直接啓動(建議使用下面方式啓動) docker run -di --name=registry-p5000 -p 5000:5000 --restart=alwarys registry # 方法二:掛載配置文件啓動 docker run -di --name=registry-p5000 --restart=alwarys -p 5000:5000 -v /opt/docker/registry:/var/lib/registry -v /opt/docker/registry-data/config.yml:/etc/docker/registry/config.yml registry --restart=alwarys:docker重啓的時候,此容器一起啓動
config.yml
配置如下:
storage:delete:enabled: true
允許刪除私有倉庫鏡像version: 0.1 log: fields: service: registry storage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3
- 瀏覽器檢查倉庫是否搭建成功
頁面看到 {“repositories” : []} 表示私有倉庫搭建成功並且內容爲空# 瀏覽器訪問(宿主ip:容器映射端口) http://192.168.0.233:5000/v2/_catalog # 命令行訪問 curl -X GET 192.168.0.233:5000/v2/_catalog
- 修改docker配置文件
daemon.json
前面我們修改過docker的配置文件(設置ustc鏡像倉庫地址)
現在我們配置私有倉庫地址
添加如下配置:vi /etc/docker/daemon.json
"insecure-registries" : ["192.168.0.233:5000"]
七、鏡像操作之私有倉庫
1、私有倉庫 - 鏡像上傳與下載
命名規則:宿主機ip:私有倉庫映射端口/倉庫自定文件夾/文件名:版本
- 標記此鏡像爲私有倉庫的鏡像
docker tag jdk1.8 192.168.0.233:5000/jdk1.8:v1.0
- 上傳標記的鏡像到私服
docker push 192.168.0.233:5000/jdk1.8:v1.0
- 下載標記的鏡像從私服
docker pull 192.168.0.233:5000/jdk1.8:v1.0
2、私有倉庫 - 鏡像查詢
- 列出私有倉庫中所有鏡像
# 瀏覽器訪問 http://192.168.0.233:5000/v2/_catalog # 命令行訪問 curl -X GET 192.168.0.233:5000/v2/_catalog
- 列出某個鏡像所有tag
# 瀏覽器訪問 <repository>: 鏡像名 http://ip:端口/v2/<repository>/tags/list # 例如 http://192.168.0.233:5000/v2/common/jdk1.8/tags/list # 命令行 curl -X GET http://192.168.0.233:5000/v2/common/jdk1.8/tags/list
- 列出某個tag的詳細信息
# 瀏覽器訪問 # <repository>: 鏡像名 # <tag>: tag號 http://ip:端口/v2/<repository>/manifests/<tag> # 例如 http://192.168.0.233:5000/v2/common/jdk1.8/manifests/v1.0 # 命令行訪問 curl -X GET http://192.168.0.233:5000/v2/common/jdk1.8/manifests/v1.0
- 獲取某個tag的digest
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET <私有庫ip>:端口號/v2/<鏡像repository>/manifests/<鏡像tag> # 示例如下 curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.0.233:5000/v2/jdk1.8/manifests/v1.0
3、私有倉庫 - 鏡像刪除
-
修改
config.yml
配置文件
私有庫默認是不支持刪除鏡像的,需要修改config.yml
配置文件,在storage
節點下加入delete: enabled: true
,然後重啓私有庫。
注:config.yml
文件爲私有倉庫容器創建時,掛載的新建的文件/opt/docker/registry-data/config.yml
-
獲取私有倉庫中鏡像 push 時的 digest:sha256 值
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET <私有庫ip>:端口號/v2/<鏡像repository>/manifests/<鏡像tag> // 示例如下 curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.0.233:5000/v2/test/nginx1.17.9-p80/manifests/v1.0
-
發送 HTTP DELETE 請求
# <repository>: 鏡像名 # <reference>: 上一步查到的 digest:sha256 值 http://ip:端口/v2/<repository>/manifests/sha256:<reference> # 可通過命令執行 curl -I -X DELETE http://ip:端口/v2/<repository>/manifests/<reference> # 示例如下 curl -I -X DELETE http://192.168.0.233:5000/v2/test/nginx1.17.9-p80/manifests/sha256:39695eb0e4b5841667482d382ce0a5fb481e26dd80a7c30babcf228fc22347d9
-
檢查是否刪除成功
# 此步查詢,依然能看到被刪除的鏡像,delete刪除是邏輯刪除 curl -X GET 192.168.0.233:5000/v2/_catalog # 檢查被刪除的鏡像tag curl -X GET 192.168.0.233:5000/v2/test/nginx1.17.9-p80/tags/list
-
進入私有倉庫容器執行清理命令
前面的刪除爲邏輯刪除,實際還是佔用磁盤大小。我們需要刷新整理倉庫容器,來完全刪除# 進入私有倉庫容器 docker exec -it 容器ID sh # 進行垃圾回收 registry garbage-collect /etc/docker/registry/config.yml # 也可以一步到位 docker exec -it <私有庫的容器ID或者容器名> sh -c 'registry garbage-collect /etc/docker/registry/config.yml'
4、私有倉庫 - 鏡像刪除 - 腳本刪除
具體介紹可查看: [docker-delete] 自定義指令介紹 - swotXu.
- 下載腳本,並配置相關環境
#先下載腳本到/usr/local/bin/目錄下 curl https://gitee.com/swotxu/docker-delete/raw/master/docker-delete.sh | sudo tee /usr/local/bin/docker-delete >/dev/null #賦予可執行權限 chmod a+x /usr/local/bin/docker-delete #私有庫鏡像存儲目錄路徑全局環境變量(該路徑就是運行私有庫容器時,用-v 命令將私有庫容器內 /var/lib/registry目錄掛載到本機的路徑) #例: /opt/docker/registry/是我運行容器時私有庫鏡像存儲目錄掛載到本地的目錄 echo "export DOCKER_REGISTRY_DIR=/opt/docker/registry" >>/etc/profile #運行私有庫容器ID全局環境變量設置(正在運行的私有庫容器的 ID) #例: 404d729f6edf是我的私有庫庫容器的id echo "export DOCKER_REGISTRY_CONTAINER_ID=404d729f6edf" >>/etc/profile #使配置生效 source /etc/profile
- 指令使用
# 查詢所有鏡像 docker-delete -sr # 查詢鏡像所有 tag docker-delete -st test/nginx1.17.9-p80 # 刪除鏡像指定的tag docker-delete -dt test/nginx1.17.9-p80 v1.0 # 刪除鏡像 docker-delete -dr test/nginx1.17.9-p80
八、其他問題處理
1、修改已創建好的容器配置,如端口映射,目錄掛載等
- 方法一:刪除原容器,重新創建
- 方法二:修改容器配置文件
# 查看容器的 CONTAINER ID
docker ps -a
docker inspect 容器名
# 進入 containers 文件夾下,根據上面查找出的ID,查找文件夾
cd /var/lib/docker/containers/
# 修改容器的配置文件
cat /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
# 例如:
cat /var/lib/docker/containers/7dad134a4c1f04c4d4d73f32d72b7e2002671db8d37b6f325115c1af71f57a9d/hostconfig.json