最詳細的 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

yum更新

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

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
    
  • 進入容器
    # 進入容器
    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容器,查看主配置文件在這裏插入圖片描述
    根據主配置文件,查找導入的配置文件在這裏插入圖片描述
    將宿主機靜態文件拷貝至默認文件位置
    在這裏插入圖片描述
    最後瀏覽器訪問nginx的靜態文件
    在這裏插入圖片描述

4、Redis部署

  • 拉取redis鏡像
    docker pull redis
    
  • 創建redis容器
    docker run -di --name=redis-p16379 -p 16379:6379 redis
    
  • 遠程連接
    # win下,打開CMD窗口,cd到redis-cli.exe同目錄下,利用客戶端連接工具連接
    redis-cli -h 192.168.0.233 -p 16379
    
    或者直接使用redis客戶端管理工具連接
    在這裏插入圖片描述

四、遷移與備份

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 文件名注意大小寫,文件無後綴
    # cd到當前目錄
    cd /opt/docker/docker-jdk8/
    # 創建 Dockerfile文件
    vi Dockerfile
    
    編輯 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章