Docker 之 入門使用

目錄 start

  1. Docker
    1. 簡介
    2. 個人理解
    3. 學習資源
  2. 安裝與卸載
    1. Linux
      1. 安裝包安裝
      2. Ubuntu
      3. Debian
      4. Centos
      5. Arch
      6. 不加sudo執行docker命令
    2. Windows
  3. 基礎管理
    1. 鏡像倉庫
      1. 搭建本地鏡像倉庫
    2. 基礎命令
    3. 鏡像命令
    4. 容器命令
      1. ps
      2. create
      3. run
        1. 資源限制
      4. exec
      5. commit
      6. port
    5. 端口映射
  4. 數據卷
    1. 數據卷容器
  5. 容器編排
    1. Docker-Compose
      1. 配置文件
      2. 使用命令
      3. Tips
    2. Docker-Machine
    3. Docker-Swarm
  6. 網絡
    1. None
    2. Host
    3. Bridge
    4. User-defined
    5. 跨主機容器通信
      1. overlay
  7. Dockerfile
    1. dockerignore文件的使用

目錄 end|2020-01-28 17:29|


Docker

Official Doc | docker-cnDocker中國

簡介

  • Docker 是一個開源的應用容器引擎 理解爲加強版虛擬機
  • 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

個人理解

  • docker中的容器是動態的,隨時創建和銷燬,只有鏡像是持久化的
  • 而且容器是一個虛擬出來的功能完備的Linux操作系統可以進行登錄運行命令
  • docker images來得到所有的本地鏡像名
    • 使用docker run --name {name} -d {image-name}新命名一個容器來啓動某個鏡像
    • 然後docker ps查看容器運行狀況
  • 鏡像的命名:
    • 如果要push到倉庫就要遵循這個規範,本地用就無所謂了,而且以後也可以取新的名字 docker tag 原名 新名
    • 官方的hub: 用戶名/鏡像名:tag
    • 非官方的例如阿里 registry.cn-hangzhou.aliyuncs.com/myth/jdk8:alpine jdk8是鏡像名,前面的是倉庫地址

學習資源

碼雲上Docke相關資源

docker資源彙總
簡述 Docker


安裝與卸載

daocloud安裝幫助 | Docker 加速器

Linux

Official doc 所有的發行版

docker.io 是舊版本 現在新的Docker分爲 docker-ce docker-ee
注意 Deepin上 如果通過 apt 去安裝 docker-compose 它會把 docker-ce 卸掉, 裝舊的 docker.io

安裝包安裝

官方文件地址

  • Debian系
    • deb包選擇
    • 進去後選擇debain的版本,deepin15.4 的版本是stretch 然後pool/stable/amd64/選版本即可
    • 例如:Deepin 15.4直接點這裏
    • 這兩種方式裝的是同一個版本號
    • 雙擊或者sudo dpkg -i deb文件
    • 測試安裝成功 sudo docker run hello-world

Ubuntu

snap

  • 安裝snap sudo apt install snapd
  • 查看適用於當前系統的包:snap install find
  • 安裝: snap install docker

Debian

參考

  • sudo echo "deb http://http.debian.net/debian jessie-backports main" >> /etc/apt/sources.list
  • sudo apt-get install docker-ce
  1. 前置軟件 sudo apt-get install
    apt-transport-https
    ca-certificates
    curl
    gnupg2
    lsb-release
    software-properties-common

使用清華大學鏡像源安裝

使用阿里雲鏡像源

  1. curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -
  2. sudo add-apt-repository
    “deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian
    $(lsb_release -cs) stable”
  1. 特別注意 lsb_release -cs 命令的執行結果, 本應該獲取到的是發行代號 jessie stretch 等等, 但是Deepin15.8執行結果是 unstable …
  2. 所以要手動添加 或修改爲 jessie deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian jessie stable

使用官方源

  1. curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
  2. sudo add-apt-repository
    “deb [arch=amd64] https://download.docker.com/linux/debian
    $(lsb_release -cs) stable”

Centos

  • sudo yum install docker
    • Ubuntu的話,Docker沒有啓動, 只要一執行Docker相關命令就會自動啓動, 但是Centos要手動啓動
    • service docker start 設置開機啓動: chkconfig docker on

Arch

  • pacman -S docker

不加sudo執行docker命令

官方文檔

  • 如果沒有docker組,添加組 sudo groupadd docker
  • 將當前用戶加入用戶組 sudo gpasswd -a $USER docker
  • 然後重新註銷登錄,或者退出會話重新登錄即可

Windows

Windows上本質是用了VirtualBox創建虛擬機來跑Docker, 屎一般的體驗, 然而Win10的WSL因爲不能模擬aufs 以及 cgroup 所以能裝不能用
只能裝上docker for windows 然後把Docker守護進程的套接字文件配置給wsl用。。。。。

  • 參考博客
  • 官方toolbox 下載
  • 然後雙擊安裝,勾選上virtualbox 記住cpu要開虛擬化
  • 安裝完成後就會有三個圖標在桌面上,然後進入Docker Quickstart Terminal後 docker run hello-world 有正常輸出即可

基礎管理

docker 所有的數據默認存儲在 /var/lib/docker

鏡像倉庫

默認的DockerHub因爲在國外所以網絡不太穩定

Docker中國

三種使用的方式

  1. 使用指定的URL docker pull registry.docker-cn.com/myname/myrepo:mytag
  2. 僅僅配置當前守護進程, 重啓就失效了docker --registry-mirror=https://registry.docker-cn.com daemon
  3. 修改 /etc/docker/daemon.json文件, 永久性更改
    {"registry-mirrors": ["https://registry.docker-cn.com"]}

時速雲

  • sudo docker pull index.tenxcloud.com/<namespace>/<repository>:<tag>
  • 下載後可以用別名 docker tag index.tenxcloud.com/docker_library/node:lastest node:lastest
  • 然後爲了控制檯乾淨可以直接將原來的長命名tag直接刪除

阿里雲

  • 開發者平臺
  • 配置命名空間,倉庫,然後使用文檔的配置即可

百度雲

  1. 登錄百度雲鏡像倉庫

    • sudo docker login --username=[username] hub.baidubce.com
    • username:鏡像倉庫名稱,即是開通鏡像倉庫時填寫的用戶名。輸入密碼後完成登錄。
  2. 上傳鏡像

    • sudo docker tag [ImageId] hub.baidubce.com/[namespace]/[ImageName]:[鏡像版本號]
    • sudo docker push hub.baidubce.com/[namespace]/[ImageName]:[鏡像版本號]
      • ImageId和鏡像版本號根據鏡像信息補充
      • namespace是開通鏡像倉庫時填寫的命名空間
      • ImageName是在控制檯創建的鏡像名稱
  3. 下載鏡像

    • 登錄到鏡像倉庫,需輸入密碼
    • sudo docker pull hub.baidubce.com/[namespace]/[ImageName]:[鏡像版本號]
  4. 使用加速器

    • docker軟件源地址:https://mirror.baidubce.com

搭建本地鏡像倉庫

Official doc

參考:Docker Registry V1 與 V2 的區別解析以及靈雀雲的實時同步遷移實踐

Github:v1 | Github:v2

v1

  • 服務器上運行 並映射到本地目錄 docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
  • 對服務器中docker已經有的鏡像 設置別名 docker tag 鏡像 ip:port/鏡像名
  • docker push ip:port/鏡像名
  • 查看服務器上倉庫的鏡像 curl http://IP:5000/v1/search

v2

  • 啓動鏡像 docker run -d -p 5000:5000 --name registry registry:2
  • 一樣的設置好別名, 然後push上去
  • 查看倉庫中的鏡像 curl IP:5000/v2/_catalog

注意 由於 docker client 默認是用的 HTTPS 方式通信, 但是這個本地的 registry 默認是 HTTP 的, 所以有幾種解決方案

  1. 直接將本地倉庫的IP和端口 設置爲本地Docker的白名單
    • 給dockerd 添加參數 DOCKER_OPTS="--insecure-registry ip:port"
    • 或者配置 /etc/docker/daemon.json { "insecure-registries":["IP:PORT"] }
    • 重啓Docker服務
  2. 配置 registry 爲 HTTPS, 那麼就需要配置SSL證書, 使用本地證書或者公網證書

基礎命令

直接運行 docker, 就會有命令的使用提示 例如查看docker版本 docker version

登錄鏡像倉庫

  • 登錄hub.docker :docker login 或者 docker login -u username -p password
  • 登錄時速雲:sudo docker login index.tenxcloud.com
  • 登錄百度雲: docker login --username=[username] hub.baidubce.com

鏡像命令

  • 查看所有 : docker images
    • docker images -a 查看所有鏡像(包括中間鏡像)
  • 搜索 : docker search 鏡像名
  • 安裝 : docker pull 鏡像名
  • 刪除 : docker rmi 鏡像名
  • 查看詳細: docker inspect [-f {{".Architesture"}}] -f 查看JSON格式的具體節點的數據值
  • 查看歷史:docker history imagename
  • 添加標籤(別名): docker tag originname newname
  • 導出鏡像文件:docker save -o ubuntu.tar ubuntu:14.04
    • 導入鏡像文件: docker load --input ubuntu.tardocker load < ubuntu.tar
  • 上傳鏡像: docker push mythos/test:lastest

容器命令

  • 查看所有容器的狀態:docker stats 能看到正在運行的容器內存 cpu io net等信息

    • -a 所有容器
    • --no-stream 不阻塞標準輸出流,只輸出一次信息
  • 停止容器:docker stop 容器name

  • 重啓容器:docker restart 容器name

  • 啓動容器:docker start 容器name

    • -i 交互模式,也可以進入終端
  • 刪除容器:docker rm 容器name

    • -f 強行停止正在運行的容器並刪除
    • -l 刪除容器的連接,但是保留容器
    • -v 刪除容器掛載的數據卷
    • 刪除所有容器:docker rm ${docker -a -q}
    • 刪除所有容器和掛載的目錄:docker system prune --volumes -f
  • 容器日誌(終端所有輸入輸出):docker logs 容器name或id

  • 重命名 : docker rename origin new

  • 導入導出 (容器快照):

    • 導出: docker export -o test.tar 容器名 docker export 容器name > test.tar
    • 導入: docker import [-c |--change=[]] [-m | --message=[]] file|URL - [repository]:[tag]
    • -c | --change=[] 選項在導入的同時執行對容器就行修改的Dockerfile指令。

Attach a volume to a container while it is running

ps

  • 查看當前運行的容器:docker ps
    • 查看所有容器 :docker ps -a
    • 查看佔用 :docker ps -s
    • ps formatting
    .ID 	    Container ID
    .Image 	    Image ID
    .Command 	Quoted command
    .CreatedAt 	Time when the container was created.
    .RunningFor Elapsed time since the container was started.
    .Ports 	    Exposed ports.
    .Status 	Container status.
    .Size 	    Container disk size.
    .Names 	    Container names.
    .Labels 	All labels assigned to the container.
    .Label 	    Value of a specific label for this container. For example '{{.Label "com.docker.swarm.cpu"}}'
    .Mounts 	Names of the volumes mounted in this container.
    .Networks 	Names of the networks attached to this container.

create

官方文檔

run

Docker run 命令的使用方法
等價於 docker create 再 docker start

  • docker run -d --name conrainer-name image-name touch a.md ,如果鏡像本地沒有會自動pull
    • --name 配置容器名字
    • -d 後臺啓動程序
    • -i 交互模式運行容器(標準輸入和標準輸出) docker run -it ubuntu /bin/bash
    • -t 容器啓動後進入其命令行
    • -v 將本地文件夾建立映射到容器內 -v 本機:容器
    • -p 端口映射左本機右容器:-p 44:22主機容器端口相同就:-p 22 將容器所有EXPOSE的端口映射到宿主機隨機端口-P
      • 綁定udp端口 -p 44:22/udp
    • --env name="tanky" 設置環境變量
    • --cpu-shares 設置CPU的相對權重,只在link之間容器的權重比例
    • --cpuset-cpus 限制只能運行在某標號的CPU上
    • --user -u 限制用戶
    • --cap-drop 去除能力
    • --link 鏈接其他容器
    • --rm 容器運行結束退出就自動刪除該容器 注意和-d不能共存
    • --restart=always 設置該容器隨dokcer 服務自啓動
    • --hostname 容器hostname 指定容器的hostname

-e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro

資源限制

內存限制

  • 限制最大內存100M --memory 100M 或者 -m 100M
  • 配置交換內存不受限制 --memory-swap -1
    • 不配置該項 或者 該項小於 --memory 則都是採用默認值, --memory 的兩倍

參考博客: Docker 資源限制之內存

exec

  • 登錄容器:

    • docker exec -it 容器name或id bash
    • docker attach 容器id 這個命令雖然簡單,但是退出會話就自動關閉了容器
  • 這些選項不加就是默認值,加上短參數形式就是設爲另一個值 如 -t

    • -i--interactive=ture|false 打開標準輸入接受用戶輸入命令
    • --privileged=true|false 是否給以最高權限
    • -t--tty=true|false 是否分配僞終端
    • -u--user="" 執行命令的用戶或ID
  • 使用 nsenter 連接到容器:

    • PID=${docker-pid 容器id}
    • nsenter --target $PID --mount --uts --ipc --net --pid

commit

  • docker commit 容器id 鏡像name 將容器爲id的當前容器 保存爲name鏡像

port

查看容器的端口映射情況, 輸出是左容器右本機, 和使用相反


端口映射

  • 當不指定對應的參數容器默認不開放任何端口給外部,可以使用 -P-p 參數來開放
    • -P 隨機映射一個 49000-49900 的端口到容器開放的端口
    • -p IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort
      • 映射到指定IP的指定端口IP:HostPort:ContainerPort
      • 映射到指定IP的任意端口IP::ContainerPort
      • 映射到所有接口的地址的指定端口HostPort:ContainerPort
    • 還可以使用 udp來標記爲udp類型 docker run -d -p 127.0.0.1::5000/udp ubuntu apt update
  • 查看端口
    • 查看容器內5000對應的外端口 docker port ubuntu17 5000
    • 查看容器的具體信息 docker inspect 容器id

數據卷

Docker 中管理數據
參考博客: 給一個正在運行的Docker容器動態添加Volume

  • 數據卷是一個可供容器使用的特殊目錄,它將宿主機操作系統目錄映射進容器 類似於 mount操作

    • 數據卷可以在容器之間共享重用
    • 數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作
    • 對數據卷的更新不會影響鏡像,解耦了應用和數據
    • 卷會一直存在,直到沒有容器使用,纔可以安全的卸載
  • docker run -v dir:dir[:ro] 一般是創建容器時使用,和-p類似可以多個,左本機右容器 默認rw權限可以指定 ro只讀

    • 可以將一個文件掛載爲數據卷,但是文件夾更好,文件可能會有問題出現
  • 掛載宿主機時區及時間 /etc/localtime:/etc/localtime

數據卷容器

  • docker run -it -v /test --name data ubuntu 運行一個掛載了數據卷的容器
  • 引用數據卷容器 來掛載數據卷:docker run -it --volumes-from data --name db1 ubuntu
  • 從已經掛載了數據卷容器的容器 來掛載數據卷:docker run -it --volumes-from db1 --name db2 ubuntu
  • 使用 --volumes-from 參數所掛載數據卷的容器並不需要保持在運行狀態
  • 如果刪除了掛載的容器,數據卷並不會自動刪除,而是要在刪除最後一個容器時 使用 docker rm -v 來聲明刪除容器並刪除關聯的數據卷

利用數據卷容器來遷移數據

  • 備份:
    • docker run --volumes-from data -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /data
    • 先基於Ubuntu創建一個worker容器並引用了數據卷容器data,然後將當前目錄作爲數據卷掛載進去,並執行tar命令,打包到數據卷容器的目錄下
    • 實現了將當前目錄歸檔到數據卷容器下
  • 恢復:
    • 創建一個帶有數據卷的容器(目標容器)docker run -v /data --name reuse ubuntu /bin/bash
    • 解壓當前目錄的tar文件到數據卷容器中 docker run --volumes-from reuse -v $(pwd):/backup busybox tar xvf /backup/backup.tar
    • 這個就是實現了將本地的歸檔數據放到指定的容器內,如果要從數據卷容器中恢復到別的容器就只要掛載對應的數據卷容器然後進目錄直接解壓即可

容器編排

Docker-Compose

Official

聲明式環境,管理多容器, 並處理好相關資源的關係

Demo: 開源電商平臺
Demo: 安裝 Kafka

  • 安裝
    • 最簡單: sudo pip install docker-compose

配置文件

一個配置文件就表示了一組容器, 以及相關的網絡,文件等配置, docker-compose 都是基於該配置文件進行基本命令操作
語法上和 docker run 基本一致, 只不過以 yml 形式配置而已

version: "2.1"
services:
  zookeeper:
    image: ${IMAGE_NAME:-defaultImage}
    expose:
      - "6666"
    ports:
      - "6666:6666"
    volumes:
      - /etc/localtime:/etc/localtime
    command: ./bin/start.sh
    links:
        - "mysql:mysql"
    environment:
      - NAME=who

使用命令

必須要在 docker-compose.yml 文件目錄下執行

  • help
  • up # 自動完成構建鏡像,創建服務,啓動服務,並關聯服務等操作, -d 後臺執行
  • down # 停止並刪除該服務的所有容器, 移除網絡, -v 移除掛載的volume
  • start # 啓動存在的服務
  • stop # 停止
  • restart # 重啓項目中服務
  • exec # 進入指定容器
  • image # 列出 Compose 文件中包含的鏡像
  • kill [SERVICE…]
  • pause [SERVICE…]
  • unpause [SERVICE…]
  • ps # 列出項目中所有容器

Tips

yml所在的目錄名會作爲容器名的前綴


Docker-Machine

創建一個docker集羣環境 官方文檔安裝

Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path
Error with pre-create check: “This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory”

Docker-Swarm


網絡

Official Doc 分爲 none host brige user-defined 幾種類型

None

docker run -it --network none busybox

  • 不聯網的容器, ifconfig 可以看到只有 lo

Host

docker run -it --network host busybox

  • 採用宿主機的網絡, 也就是說和宿主機使用同一個網絡環境, hostname都是host的
    1. 特點是性能, 但是不夠靈活, 要考慮和host上的端口衝突問題
    2. 直接配置host的網絡: 例如配置防火牆容器

Bridge

安裝 Docker 的時候, 都會創建一個 docker0 的網橋 Linux bridge

  • 如果沒有指定 --network 或者使用 --network default 創建容器 都會默認掛載到 docker0 上
  • 通過 docker network inspect bridge 命令可以看到子網掩碼是 172.17.0.0/16 網關是 172.17.0.1
    • 也就是說能容納 2的16次冪 -2 個容器 (65534), 容器創建時會依次分配ip

注意: 此方式下容器之間是互通的, 通常使用的 --link containerName:aliasName 也只不過是在 /etc/hosts 文件中添加了容器的 dns 而已

特別容易出現鎖,一個沒有啓動,其他的都啓動不了 嘗試? sudo service docker restart

  • 例如: 創建一個MySQL容器供一個Ubuntu容器使用
  1. 創建MySQL容器 docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=ad -d mysql
  2. 創建Ubuntu容器 docker run -d --name test --link mysql2:db ubuntu
    • link參數說明 :--link name:alias 在父容器中會將該映射加入host文件,所以無需找ip,直接使用別名
  3. docker會連接兩個容器,而不用通過暴露端口來實現,web容器的host文件以及環境變量都會追加上mysql2的配置
  4. 所以在Ubuntu容器中連接MySQL容器, mysql -h db -u root -pad 即可連接上mysql
    • 如需看IP就 cat /etc/hosts 中myslq容器別名爲db值的IP地址
    • 或者直接 ping db apt install inetutils-ping ifconfig就要安裝net-tools
  • 例如:創建一個Nginx和一個Springboot搭建的web服務
    • 構建Springboot應用鏡像,構建應用容器 開放8888端口
    • 新建nginx容器:docker run --name youhuigo -d -p 80:80 -v /home/kuang/nginx/conf/:/etc/nginx/conf.d/:ro --link you:web nginx
  • 配置文件:一樣的cat /etc/hosts 查看容器的IP, 其實最簡單就是用link配置時的別名即可,因爲Docker已經幫我們配置好了host。。。
    upstream youhui {
        server 172.17.0.4:8888;
    }

    server {
        listen 80;
        server_name youhui;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Nginx-Proxt true;

            proxy_pass http://youhui;
            proxy_redirect off;
        }
    }

weave 能解決跨宿主機的容器互聯問題

User-defined

Docker 提供三種 網絡驅動 bridge overlay macvlan, 後兩者可用於跨主機的容器通信

跨主機容器通信

overlay

參考博客: DOCKER的內置OVERLAY網絡


Dockerfile

Dockerfile文件學習

dockerignore文件的使用

  • .dockerignore文件是依據 Go 的 PathMatch 規範來的,使用和.gitignore類似
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章