docker

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

准备站点证书

  1. 创建 CA 私钥
bash 复制代码
openssl genrsa -out "root-ca.key" 4096
  1. 利用私钥创建 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'
  1. 配置 CA 根证书,新建 root-ca.cnf
bash 复制代码
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
  1. 签发根证书
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
  1. 生成站点 SSL 私钥
bash 复制代码
openssl genrsa -out "docker.domain.com.key" 4096
  1. 使用私钥生成证书请求文件
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'
  1. 配置证书,新建 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
  1. 签署站点 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

  1. 在容器中使用 mount 命令查看挂载信息

    bash 复制代码
    mount

    挂载机制让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf 文件立刻得到更新

  2. 在 /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
  3. 手动指定容器的配置,使用 docker run 命令启动容器时加入如下参数

    -h [HOSTNAME] 或者 --hostname=[HOSTNAME] 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts.

    --dns=[IP_ADDRESS] 添加 DNS 服务器到容器的 /etc/resolv.conf 中.

    --dns-search=DOMAIN 设定容器的搜索域

相关推荐
WTT001127 分钟前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋335 分钟前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
日记跟新中1 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭1 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
明 庭1 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
BUG 4041 小时前
Linux——Shell
linux·运维·服务器
大霞上仙2 小时前
Linux 多命令执行
linux·运维·服务器
冷心笑看丽美人2 小时前
探索 Samba 服务器:搭建跨平台文件共享的桥梁
运维·服务器
晨欣2 小时前
Kibana:LINUX_X86_64 和 DEB_X86_64两种可选下载方式的区别
linux·运维·服务器