docker官网文档需翻墙,以下笔记为国内docker文档
目录
安装docker
Ubuntu
卸载旧版本
bash
sudo apt-get remove docker docker-engine docker.io
使用 APT 安装
由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书
bash
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥
bash
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
向 sources.list 中添加 Docker 软件源
bash
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker
更新 apt 软件包缓存,并安装 docker-ce
bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
启动 Docker
bash
sudo systemctl enable docker
sudo systemctl start docker
建立 docker 用户组
建立 docker 组
bash
sudo groupadd docker
当前用户加入 docker 组
bash
sudo usermod -aG docker $USER
重启操作系统生效
测试 Docker 是否安装正确
bash
docker run --rm hello-world
镜像加速
拉取 Docker 镜像失败,配置 Docker 国内镜像加速
开通个人实例
找到镜像加速器根据操作文档配置镜像地址
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
CentOS
卸载旧版本
bash
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
使用 yum 安装
安装依赖包
bash
sudo yum install -y yum-utils
添加 yum 软件源
bash
$ sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
安装 Docker
更新 yum 软件源缓存,并安装 docker-ce
bash
sudo yum install docker-ce docker-ce-cli containerd.io
其余步骤同ubuntu
使用镜像
bash
$ docker image --help
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Download an image from a registry
push Upload an image to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
获取镜像
bash
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
用 仓库名[:标签] 方式获取
bash
docker pull ubuntu:18.04
运行
用 ubuntu:18.04 镜像为基础来启动容器,开启里面的 bash 并且进行交互式操作
bash
docker run -it --rm ubuntu:18.04 bash
列出镜像
bash
docker image ls
镜像体积
bash
docker system df
虚悬镜像
bash
docker image ls -f dangling=true
删除虚悬镜像
bash
docker image prune
中间层镜像
bash
docker image ls -a
列出部分镜像
bash
docker image ls ubuntu:18.04
since为列出建立之后的镜像,before 为之前
bash
docker image ls -f since=ubuntu:18.04
通过 LABEL 来过滤列出镜像
bash
docker image ls -f label=ubuntu
以特定格式显示
只显示镜像ID
bash
docker image ls -q
只包含镜像ID和仓库名
bash
docker image ls --format "{{.ID}}: {{.Repository}}"
以表格等距显示,并且有标题行
bash
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
删除本地镜像
bash
docker image rm [选项] <镜像1> [<镜像2> ...]
用 ID、镜像名、摘要删除镜像
bash
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 7614ae9453d1 2 years ago 113MB
ubuntu 18.04 5a214d77f5d7 2 years ago 63.1MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
bash
docker image rm feb
bash
docker image rm redis
bash
$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
redis latest sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339 7614ae9453d1 2 years ago 113MB
ubuntu 18.04 sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6 5a214d77f5d7 2 years ago 63.1MB
bash
docker image rm redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
用 docker image ls 命令来配合
删除所有仓库名为 redis 的镜像
bash
docker image rm $(docker image ls -q redis)
删除mongo:3.2之前的镜像
bash
docker image rm $(docker image ls -q -f before=mongo:3.2)
利用 commit 理解镜像构成
定制一个 Web 服务器,理解镜像是如何构建的
用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口
bash
docker run --name webserver -d -p 80:80 nginx
可以用浏览器去访问,本地为 http://localhost ,虚拟机等使用ip地址,会看到默认的 Nginx 欢迎页面
修改Nginx欢迎页
bash
$ docker exec -it webserver bash
root@109cbe92906f:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
修改了容器的文件,也就是改动了容器的存储层,通过 docker diff 命令看到具体的改动
bash
docker diff webserver
运行容器时,所做任何文件的修改都会被记录于容器存储层,docker commit 命令将容器的存储层保存下来成为镜像,该镜像拥有原有容器最后的文件变化
docker commit 的语法格式:
bash
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
将容器保存为镜像
bash
$ docker commit --author "test<test@gmail.com>" --message "测试commit" webserve
r nginx:v2
查看新定制的镜像
bash
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 068eef6b4857 4 seconds ago 141MB
nginx latest 605c77e624dd 2 years ago 141MB
docker history 具体查看镜像内的历史记录
bash
$ docker history nginx:v2
IMAGE CREATED CREATED BY SIZE COMMENT
068eef6b4857 About a minute ago nginx -g daemon off; 1.25kB 测试commit
605c77e624dd 2 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon... 0B
<missing> 2 years ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 2 years ago /bin/sh -c #(nop) EXPOSE 80 0B
...
运行新镜像,命名新服务为 web2,并映射到 81 端口,浏览器访问 http://localhost:81
bash
docker run --name web2 -d -p 81:80 nginx:v2
使用 Dockerfile 定制镜像
建立一个文本文件,并命名为 Dockerfile,其内容为
bash
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
构建镜像
格式为
bash
docker build [选项] <上下文路径/URL/->
在 Dockerfile 文件所在目录执行
bash
docker build -t nginx:v3 .
其它 docker build 的用法
直接用 Git repo 进行构建
bash
docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world
用给定的 tar 压缩包构建
bash
docker build http://server/context.tar.gz
从标准输入中读取 Dockerfile 进行构建
bash
docker build - < Dockerfile
或
bash
cat Dockerfile | docker build -
从标准输入中读取上下文压缩包进行构建
bash
docker build - < context.tar.gz
Dockerfile 指令
ENTRYPOINT 入口点
用 ENTRYPOINT 实现获取公网 IP 的镜像
bash
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net" ]
构建镜像
bash
docker build -t myip .
查询当前公网 IP并显示 HTTP 头信息
bash
docker run myip -i
HEALTHCHECK 健康检查
bash
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
构建镜像
bash
docker build -t myweb:v1 .
启动容器
bash
docker run -d --name web -p 80:80 myweb:v1
查看容器状态
bash
docker container ls
docker inspect 查看健康状态
bash
docker inspect --format '{{json .State.Health}}' web | python -m json.tool
Dockerfile 多阶段构建
解决构建 Docker 镜像时存在的问题:
1.镜像层次多,镜像体积较大,部署时间变长
2.源代码存在泄露的风险
3.部署过程较复杂
编写 app.go 文件,该程序输出 Hello World!
bash
package main
import "fmt"
func main(){
fmt.Printf("Hello World!");
}
编写 Dockerfile 文件
bash
FROM golang:alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest as prod
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/go/helloworld/app .
CMD ["./app"]
构建镜像
bash
docker build -t go/helloworld:3 .
实战多阶段构建 Laravel 镜像
新建 Laravel 项目或在已有的 Laravel 项目根目录下新建
.dockerignore 文件
bash
.idea/
.git/
vendor/
node_modules/
public/js/
public/css/
public/mix-manifest.json
yarn-error.log
bootstrap/cache/*
storage/
# 自行添加其他需要排除的文件,例如 .env.* 文件
laravel.conf 文件
bash
server {
listen 80 default_server;
root /app/laravel/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .*\.php(\/.*)*$ {
fastcgi_pass laravel:9000;
include fastcgi.conf;
# fastcgi_connect_timeout 300;
# fastcgi_send_timeout 300;
# fastcgi_read_timeout 300;
}
}
Dockerfile 文件
bash
FROM node:alpine as frontend
COPY package.json /app/
RUN set -x ; cd /app \
&& npm install --registry=https://registry.npmmirror.com
COPY webpack.mix.js webpack.config.js tailwind.config.js /app/
COPY resources/ /app/resources/
RUN set -x ; cd /app \
&& touch artisan \
&& mkdir -p public \
&& npm run production
FROM composer as composer
COPY database/ /app/database/
COPY composer.json /app/
RUN set -x ; cd /app \
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
FROM php:7.4-fpm-alpine as laravel
ARG LARAVEL_PATH=/app/laravel
COPY --from=composer /app/vendor/ ${LARAVEL_PATH}/vendor/
COPY . ${LARAVEL_PATH}
COPY --from=frontend /app/public/js/ ${LARAVEL_PATH}/public/js/
COPY --from=frontend /app/public/css/ ${LARAVEL_PATH}/public/css/
COPY --from=frontend /app/public/mix-manifest.json ${LARAVEL_PATH}/public/mix-manifest.json
RUN set -x ; cd ${LARAVEL_PATH} \
&& mkdir -p storage \
&& mkdir -p storage/framework/cache \
&& mkdir -p storage/framework/sessions \
&& mkdir -p storage/framework/testing \
&& mkdir -p storage/framework/views \
&& mkdir -p storage/logs \
&& chmod -R 777 storage \
&& php artisan package:discover
FROM nginx:alpine as nginx
ARG LARAVEL_PATH=/app/laravel
COPY laravel.conf /etc/nginx/conf.d/
COPY --from=laravel ${LARAVEL_PATH}/public ${LARAVEL_PATH}/public
其它制作镜像的方式
从 rootfs 压缩包导入
格式
bash
docker import [选项] <文件>|<URL>|- [<仓库名>[:<标签>]]
示例,创建一个 OpenVZ 的 Ubuntu 16.04 模板的镜像
bash
docker import \
http://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz \
openvz/ubuntu:16.04
Docker 镜像的导入和导出 docker save 和 docker load
示例,保存 alpine 镜像
bash
$ docker save alpine -o filename
$ file filename
使用 gzip 压缩
bash
docker save alpine | gzip > alpine-latest.tar.gz
将 alpine-latest.tar.gz 文件复制到其它主机,加载镜像
bash
docker load -i alpine-latest.tar.gz
将镜像源主机迁移到目标主机
bash
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
容器
bash
$ docker container --help
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Execute a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Create and run a new container from an image
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
启动
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(exited)的容器重新启动。
新建并启动
新建容器,并输出 "Hello World",之后终止容器
bash
docker run ubuntu:18.04 /bin/echo 'Hello world'
新建容器,启动一个 bash 终端,允许用户进行交互
bash
docker run -t -i ubuntu:18.04 /bin/bash
启动已终止容器
bash
docker container start
守护态(后台)运行
使用 -d 参数在后台运行容器
bash
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
获取容器的输出信息
bash
docker container logs [container ID or NAMES]
查看/终止/启动/重启/删除
查看运行的容器信息
bash
docker container ls
查看所有(中止或运行中)的容器
bash
docker container ls -a
终止/启动/重启 容器
bash
docker container stop/start/restart [container ID or NAMES]
删除容器
bash
docker container rm [container ID or NAMES]
清理所有处于终止状态的容器
bash
docker container prune
进入
attach 命令
bash
docker attach [container ID or NAMES]
exec 命令
bash
$ docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Execute a command in a running container
Aliases:
docker container exec, docker exec
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: "<name|uid>[:<group|gid>]")
-w, --workdir string Working directory inside the container
bash
docker exec -it [container ID or NAMES] bash
从 stdin 中 exit,不会导致容器的停止
导出和导入
导出容器
导出容器快照到本地文件
bash
docker export [container ID or NAMES]> ubuntu.tar
导入容器快照
从容器快照文件中导入为镜像
bash
cat ubuntu.tar | docker import - test/ubuntu:v1.0
通过指定 URL 或者某个目录来导入
bash
docker import http://example.com/exampleimage.tgz example/imagerepo
仓库
Docker Hub
登录/登出 Docker Hub
bash
docker login
docker logout
拉取镜像
查找仓库中的镜像
bash
docker search [关键词] --filter=stars=N
拉取/推送镜像
bash
docker pull/push [镜像]
私有仓库
安装运行
bash
docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
--name registry registry
在私有仓库上传、搜索、下载镜像
标记本地镜像
格式
bash
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
示例
bash
docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
上传标记镜像
bash
docker push 127.0.0.1:5000/ubuntu:latest
查看仓库中的镜像
bash
curl 127.0.0.1:5000/v2/_catalog
下载仓库中的镜像
bash
docker pull 127.0.0.1:5000/ubuntu:latest
配置非 https 仓库地址
配置 /etc/docker/daemon.json
bash
{
"insecure-registries": [
"192.168.1.4:5000"
]
}
私有仓库高级配置
使用 openssl 自行签发证书搭建私有仓库地址 docker.domain.com
准备站点证书
- 创建 CA 私钥
bash
openssl genrsa -out "root-ca.key" 4096
- 利用私钥创建 CA 根证书请求文件
bash
openssl req \
-new -key "root-ca.key" \
-out "root-ca.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'
- 配置 CA 根证书,新建 root-ca.cnf
bash
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
- 签发根证书
bash
openssl x509 -req -days 3650 -in "root-ca.csr" \
-signkey "root-ca.key" -sha256 -out "root-ca.crt" \
-extfile "root-ca.cnf" -extensions \
root_ca
- 生成站点 SSL 私钥
bash
openssl genrsa -out "docker.domain.com.key" 4096
- 使用私钥生成证书请求文件
bash
openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'
- 配置证书,新建 site.cnf 文件
bash
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash
- 签署站点 SSL 证书
bash
openssl x509 -req -days 750 -in "site.csr" -sha256 \
-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
-out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
将 docker.domain.com.key docker.domain.com.crt root-ca.crt 移入 ssl 文件夹
配置私有仓库
私有仓库默认的配置文件位于 /etc/docker/registry/config.yml,本地编辑 config.yml,之后挂载到容器中
bash
version: 0.1
log:
accesslog:
disabled: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd
http:
addr: :443
host: https://docker.domain.com
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.domain.com.crt
key: /etc/docker/registry/ssl/docker.domain.com.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
生成 http 认证文件
bash
$ mkdir auth
$ docker run --rm \
--entrypoint htpasswd \
httpd:alpine \
-Bbn username password > auth/nginx.htpasswd
编辑 docker-compose.yml
bash
version: '3'
services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry
volumes:
registry-data:
修改 hosts
编辑 /etc/hosts
bash
127.0.0.1 docker.domain.com
启动
bash
docker-compose up -d
测试私有仓库功能
自行签发的 CA 根证书不被系统信任,需要将 CA 根证书 ssl/root-ca.crt 移入 /etc/docker/certs.d/docker.domain.com 文件夹中
bash
$ sudo mkdir -p /etc/docker/certs.d/docker.domain.com
$ sudo cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt
登录到私有仓库
bash
docker login docker.domain.com
尝试推送、拉取镜像
bash
$ docker pull ubuntu:18.04
$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04
$ docker push docker.domain.com/username/ubuntu:18.04
$ docker image rm docker.domain.com/username/ubuntu:18.04
$ docker pull docker.domain.com/username/ubuntu:18.04
退出登录,尝试推送镜像
bash
$ docker logout docker.domain.com
$ docker push docker.domain.com/username/ubuntu:18.04
no basic auth credentials
数据管理
数据卷
创建数据卷
bash
docker volume create my-vol
查看所有数据卷
bash
docker volume ls
查看指定数据卷的信息
bash
docker volume inspect my-vol
启动一个挂载数据卷的容器
bash
$ docker run -d -P \
--name web \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine
查看数据卷的具体信息
bash
docker inspect web
删除数据卷
bash
docker volume rm my-vol
清理无主的数据卷
bash
docker volume prune
挂载主机目录
挂载一个主机目录作为数据卷
bash
docker run -d -P \
--name web \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
nginx:alpine
挂载一个本地主机文件作为数据卷
记录在容器输入过的命令
bash
$ docker run --rm -it \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
bash
使用网络
外部访问容器
-P : Docker 随机映射一个端口到内部容器开放的网络端口
bash
docker run -d -P nginx:alpine
-p : 指定映射端口
bash
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有接口地址
hostPort:containerPort 格式
bash
docker run -d -p 80:80 nginx:alpine
映射到指定地址的指定端口
ip:hostPort:containerPort 格式
bash
docker run -d -p 127.0.0.1:80:80 nginx:alpine
映射到指定地址的任意端口
ip::containerPort 格式
bash
docker run -d -p 127.0.0.1::80 nginx:alpine
查看映射端口配置
bash
docker port [container_id_or_name] [port]
容器互联
新建网络
bash
docker network create -d bridge my-net
连接容器
运行一个容器并连接到新建的 my-net 网络
bash
docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net 网络
bash
docker run -it --rm --name busybox2 --network my-net busybox sh
通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系
在 busybox1 容器
bash
/ # ping busybox2
在 busybox2 容器
bash
/ # ping busybox1
配置 DNS
-
在容器中使用 mount 命令查看挂载信息
bashmount
挂载机制让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf 文件立刻得到更新
-
在 /etc/docker/daemon.json 文件配置容器的 DNS
bash{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
每次启动的容器 DNS 自动配置,查看生效
bash$ docker run -it --rm ubuntu:18.04 cat etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8
-
手动指定容器的配置,使用 docker run 命令启动容器时加入如下参数
-h [HOSTNAME] 或者 --hostname=[HOSTNAME] 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts.
--dns=[IP_ADDRESS] 添加 DNS 服务器到容器的 /etc/resolv.conf 中.
--dns-search=DOMAIN 设定容器的搜索域