Skip to content

Latest commit

 

History

History
279 lines (217 loc) · 6.37 KB

docker.md

File metadata and controls

279 lines (217 loc) · 6.37 KB

Docker

Remove Docker Images, Containers, and Volumes

Purging All Unused or Dangling Images, Containers, Volumes, and Networks

# all & force
docker system prune -af

Remove one or more specific images

# images
docker images -a

# remove image
docker rmi Image Image

Removing Containers

# containers
docker ps -a

# remove containers
docker rm ID_or_Name ID_or_Name

Remove all exited containers

# exited containers
docker ps -a -f status=exited

# remove all exited containers
docker rm $(docker ps -a -f status=exited -q)

Removing Volumes

# Volumes
docker volume ls

# remove
docker volume rm volume_name volume_name

daemon.json 的作用

docker 安裝後預設沒有 daemon.json 這個配置檔案,需要進行手動建立。配置檔案的預設路徑:/etc/docker/daemon.json

{
  "api-cors-header":"", 
  "authorization-plugins":[],
  "bip": "",
  "bridge":"",
  "cgroup-parent":"",
  "cluster-store":"",
  "cluster-store-opts":{},
  "cluster-advertise":"",
  #啟用debug的模式,啟用後,可以看到很多的啟動資訊。預設false
  "debug": true,
  "default-gateway":"",
  "default-gateway-v6":"",
  "default-runtime":"runc",
  "default-ulimits":{},
  "disable-legacy-registry":false,
  # 設定容器DNS的地址,在容器的 /etc/resolv.conf檔案中可檢視。
  "dns": ["192.168.1.1"],
  #  容器 /etc/resolv.conf 檔案,其他設定
  "dns-opts": [],
  # 設定容器的搜尋域,當設定搜尋域為 .example.com 時,在搜尋一個名為 host  主機時,DNS不僅搜尋host,還會搜索host.    example.com  注意:如果不設定, Docker 會預設用主機上的 /etc/resolv.conf 來配置容器。
  "dns-search": [],
  "exec-opts": [],
  "exec-root":"",
  "fixed-cidr":"",
  "fixed-cidr-v6":"",
  #已廢棄,使用data-root代替,這個主要看docker的版本
  "graph":"/var/lib/docker",
  #Docker執行時使用的根路徑,根路徑下的內容稍後介紹,預設/var/lib/docker
  "data-root":"/var/lib/docker",
  #Unix套接字的屬組,僅指/var/run/docker.sock
  "group": "",
  #設定容器hosts
  "hosts": [],
  "icc": false,
  #配置docker的私庫地址
  "insecure-registries": [],
  "ip":"0.0.0.0",
  "iptables": false,
  "ipv6": false,
  #預設true, 啟用 net.ipv4.ip_forward ,進入容器後使用 sysctl -a | grepnet.ipv4.ip_forward 檢視
  "ip-forward": false,
   "ip-masq":false,
  # docker主機的標籤,很實用的功能,例如定義:–label nodeName=host-121
  "labels":["nodeName=node-121"],
  "live-restore": true,
  "log-driver":"",
  "log-level":"",
  "log-opts": {},
  "max-concurrent-downloads":3,
  "max-concurrent-uploads":5,
  "mtu": 0,
  "oom-score-adjust":-500,
  #Docker守護程序的PID檔案
  "pidfile": "",
  "raw-logs": false,
  #映像加速的地址,增加後在 docker info中可檢視。
  "registry-mirrors":["xxxx"],
  "runtimes": {
     "runc": {
         "path": "runc"
     },
     "custom": {
         "path":"/usr/local/bin/my-runc-replacement",
         "runtimeArgs": [
             "--debug"
         ]
     }
  },
  #預設 false,啟用selinux支援
  "selinux-enabled": false,
  "storage-driver":"",
  "storage-opts": [],
  "swarm-default-advertise-addr":"",
  #預設 false, 啟動TLS認證開關
  "tls": true,
  #預設 ~/.docker/ca.pem,通過CA認證過的的certificate檔案路徑
  "tlscacert": "",
  #預設 ~/.docker/cert.pem ,TLS的certificate檔案路徑
  "tlscert": "",
  #預設~/.docker/key.pem,TLS的key檔案路徑
  "tlskey": "",
  #預設false,使用TLS並做後臺程序與客戶端通訊的驗證
  "tlsverify": true,
  "userland-proxy":false,
  "userns-remap":""
}

修改容器的 DNS 伺服器

檢視容器的 dns 解析設定檔案,也可以檢查 docker 執行環境 DNS

docker run busybox:latest cat /etc/resolv.conf

為容器 mybusybox 執行手動設定一個 dns 伺服器,並檢查是否生效

docker run --dns 10.0.0.2 --name mybusybox busybox:latest cat /etc/resolv.conf

定製化容器執行環境的 dns 伺服器,在 Host OS 上編輯下面檔案,增加 dns 伺服器,並重啟 docker 服務。

cat /etc/docker/daemon.json

{
  "dns" : [
    "8.8.8.8"
  ]
}

重啟服務

sudo service docker restart

複製容器內資料

docker cp <containerId>:<path> <toPath>

載入 volume

docker run -it --rm -v <volumeId>:/data node bash

使用 root 身分

docker exec -it --user root <containerId> /bin/bash
docker exec -it -u 0 <containerId> /bin/bash

{% tabs %} {% tab title="Docker Deskop for Windows/Mac 桌面開發環境" %}

host.docker.internal - 宿主

gateway.docker.internal - 網路閘道

# 在宿主執行 HTTP Server
python3 -m http.server 8000

# 在容器內連回宿主
$ docker run --rm -it alpine sh
apk add curl
curl http://host.docker.internal:8000
exit

{% endtab %}

{% tab title="Docker for Linux 伺服器原生環境" %}

可以透過名為 docker0預設橋接器網路介面自容器內存取宿主

或是使用 172.17.0.1

# Ubuntu 需要安裝 iproute2 套件以使用 ip 指令
apt install iproute2

# 在容器內取得宿主橋接器網路位址,通常會 172.17.0.1
HOST_IP=$(ip route show | awk '/default/ {print $3}')
ping $HOST_IP

{% endtab %} {% endtabs %}

Docker-compose

預設會抓 docker-compose.yml 根目錄下的 .env

也可以使用 .env.dev, .env.prod 等等檔案,然後使用 --env-file .env.dev 來選取

$ cat .env
TAG=v1.5

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"

可以使用 docker-compose config 來輸出結果

$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v1.5'

docker-compose up 啟動容器超時錯誤:ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.

export COMPOSE_HTTP_TIMEOUT=500
export DOCKER_CLIENT_TIMEOUT=500

免下 sudo

# 增加 docker 群組
sudo groupadd docker

# 當前使用者加入 docker 群組中
sudo usermod -aG docker $USER

# 切換使用者使用的群組
newgrp docker