蜗牛大师

吴庆龙的学习笔记

导航

Docker常用命令

1. 镜像

1.1 获取镜像

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到, 这里我们说一下镜像名称的格式

  • Docker 镜像仓库地址: 地址的格式一般是 <域名/IP>[:端口号]. 默认地址是 Docker Hub
  • 仓库名: 如之前所说, 这里的仓库名是两段式名称, 即 <用户名>/<软件名>. 对于 Docker Hub, 如果不给出用户名, 则默认为 library, 也就是官方镜像

1.2 列出镜像

➜  ~ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               5.0.5-alpine        ed7d2ff5a623        2 weeks ago         29.3MB
ubuntu              latest              a2a15febcdf3        3 weeks ago         64.2MB
redis               latest              f7302e4ab3a8        3 weeks ago         98.2MB
sonatype/nexus3     latest              35ca857d5b19        4 weeks ago         599MB

列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间

其中仓库名和标签在之前的基础概念章节已经介绍过了. 镜像 ID 则是镜像的唯一标识, 一个镜像可以对应多个 标签. 因此, 在上面的例子中, 我们可以看到 redis:5.0.5-alpineredis:latest 拥有相同的 ID, 因为它们对应的是同一个镜像

1.3 镜像大小

➜  ~ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   1                   761.2MB             162.4MB (21%)
Containers          1                   1                   32.93kB             0B (0%)
Local Volumes       1                   1                   200.9MB             0B (0%)
Build Cache         0                   0                   0B                  0B

1.4 删除虚悬镜像

➜  ~ docker image prune

虚悬镜像: 这个镜像既没有仓库名, 也没有标签, 均为 <none>.

<none>               <none>              00285df0df87        5 days ago          342 MB

1.5 列出部分镜像

➜  ~ docker image ls ubuntu

后面的 ubuntu 必须是 REPOSITORY 的名字.

1.6 删除本地镜像

docker image rm [选项] <镜像1> [<镜像2> ...]

其中, <镜像> 可以是 镜像短 ID镜像长 ID镜像名 或者 镜像摘要

还可以使用下面命令进行删除.

docker image rm $(docker image ls -q redis)

1.7 将容器保存为镜像(不推荐使用docker commit)

# 创建一个容器
➜  ~ docker run --name webserver -d -p 8080:80 nginx

# 修改容器中的内容
➜  ~ docker exec -it webserver bash
root@e19b32b24b6c:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@e19b32b24b6c:/# exit
exit

# 查询内容变化
➜  ~ docker diff webserver
C /run
A /run/nginx.pid
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /root
A /root/.bash_history

# 将容器保存为镜像
➜  ~ docker commit \
> --author "snailwu" \
> --message "修改了默认页面" \
> webserver \
> nginx:v1
sha256:8e660a0a87246c4186174dc77e565328c94186e81282b0845d04c93330043722

# 使用新镜像运行
➜  ~ docker run --name web2 -d -p 81:80 nginx:v1

推荐使用 Dockerfile 定制镜像

2. 容器

2.1 启动

# 输出HelloWorld之后, 容器遍退出了
➜  ~ docker run ubuntu /bin/echo "Hello World"
Hello World

# 使用 -t分配一个伪终端, -i让容器的标准输入保持打开
➜  ~ docker run -i -t ubuntu /bin/bash
root@5bf06b2f00bd:/# pwd
/
root@5bf06b2f00bd:/#

## 启动已终止容器
➜  ~ docker container start xxx
➜  ~ docker start xxx

2.2 后台运行

加上 -d 参数即可.

2.3 终止

➜  ~ docker container stop xxx
➜  ~ docker stop xxx

2.4 进入容器

使用 docker exec -it xxx /bin/bash 即可.

2.5 删除容器

# 删除终止状态的容器
➜  ~ docker container rm xxx
➜  ~ docker rm xxx

如果要删除一个运行中的容器, 可以添加 -f 参数. Docker 会发送 SIGKILL 信号给容器.

快速清除所有终止状态的容器

➜  ~ docker container prune

3. 仓库

3.1 登录/退出

➜  ~ docker login
➜  ~ docker logout

如果需要 docke push 之类的操作就需要登录了

4. 数据管理

4.1 数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录, 它绕过 UFS, 可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新, 不会影响镜像
  • 数据卷 默认会一直存在, 即使容器被删除

注意: 数据卷 的使用, 类似于 Linux 下对目录或文件进行 mount, 镜像中的被指定为挂载点的目录中的文件会隐藏掉, 能显示看的是挂载的 数据卷.

# 创建数据卷
➜  ~ docker volume create my-vol

# 查看所有数据卷
➜  ~ docker volume ls

# 查看数据卷信息
➜  ~ docker volume inspect my-vol

# 启动一个挂载数据卷的容器
➜  ~ docker run --name web -d -p 80:80 \
> --mount source=my-vol,target=/webapp \
> nginx

# 删除数据卷
➜  ~ docker volume rm my-vol

# 清理无用的数据卷
➜  ~ docker volume prune

使用 docker inspect web 查看容器信息, 数据卷信息在 "Mounts" Key下面.

"Mounts": [
  {
    "Type": "volume",
    "Name": "my-vol",
    "Source": "/var/lib/docker/volumes/my-vol/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
],

4.2 挂载主机目录

# 挂载目录
➜  ~ docker run --name web -d -p 80:80 \
> --mount type=bind,source=/src/webapp,target=/opt/webapp \
> nginx

# 挂载文件, 记录容器输入过的命令
➜  ~ docker run -rm -it \
> --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
> ubuntu /bin/bash

默认是挂载的是读写权限, 可以加上 readonly 参数指定为只读.

5. 网络

5.1 外部访问容器

使用 -p 来映射端口.

-p 则可以指定要映射的端口, 并且, 在一个指定端口上只可以绑定一个容器.

支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort.

其它命令:

# 查看容器端口
➜  ~ docker host web

5.2 容器互联

# 创建网咯
➜  ~ docker network create -d bridge wu-net

# 新建容器 web1
➜  ~ docker run -d --name web1 --network wu-net -p 81:80 nginx

# 新建容器 web2
➜  ~ docker run -d --name web2 --network wu-net -p 82:80 nginx

# 查看 wu-net 网络
➜  ~ docker network inspect wu-net

最后会看到 web1 和 web2 在一个网段内.

5.3 配置DNS

将主机的 DNS 配置文件挂载到容器中, 这样主机中的 DNS 文件发生变化时, 所有容器的 DNS 就会立刻发生更新.

还可以在 /etc/docker/daemon.json 文件中加入 DNS 信息:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

这样每次启动的容器 DNS 自动配置为 114.114.114.1148.8.8.8.

如果用户想要手动指定容器的配置, 可以在使用 docker run 命令启动容器时加入如下参数:

-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名, 它会被写到容器内的 /etc/hostname/etc/hosts. 但它在容器外部看不到, 既不会在 docker container ls 中显示, 也不会在其他的容器的 /etc/hosts 看到.

--dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中, 让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名.

--dns-search=DOMAIN 设定容器的搜索域, 当设定搜索域为 .example.com 时, 在搜索一个名为 host 的主机时, DNS 不仅搜索 host, 还会搜索 host.example.com.

注意: 如果在容器启动时没有指定最后两个参数, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器.

posted on 2019-09-09 12:09  蜗牛大师  阅读(269)  评论(0编辑  收藏  举报