This website requires JavaScript.

Docker 使用

记录我使用 Docker 的一些命令

安装 Docker

Ubuntu 安装 Docker CE

macOS 安装 Docker

使用镜像

获取镜像

Docker Hub 上有大量的高质量的镜像可以用。从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

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

示例:

docker pull ubuntu:18.04

运行

有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:18.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。

$ docker run -it --rm \
    ubuntu:18.04 \
    bash

docker run 就是运行容器的命令,具体格式我们会在 容器 一节进行详细讲解,我们这里简要的说明一下上面用到的参数。

  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 `bash`` 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm:这个参数是说容器退出后随之将其删除。
  • ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
  • bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash

列出镜像

列出已经下载下来的镜像

docker image ls

查看镜像、容器、数据卷所占用的空间 docker system df

列出特定的某个镜像 docker image ls ubuntu:18.04

看到在 mongo:3.2 之后建立的镜像 docker image ls -f since=mongo:3.2

想查看某个位置之前的镜像也可以,只需要把 since 换成 before 即可。

此外,如果镜像构建时,定义了 LABEL,还可以通过 LABEL 来过滤。

$ docker image ls -f label=com.example.version=0.1

直接列出镜像结果,并且只包含镜像ID和仓库名

$ docker image ls --format "{{.ID}}: {{.Repository}}"

删除镜像

# 语法
docker image rm [选项] <镜像1> [<镜像2> ...]
# 删除虚悬镜像
docker image prune
# 删除所有镜像
docker image rm $(docker image ls --format "{{.ID}}")
# 删除所有仓库名为 redis 的镜像
docker image rm $(docker image ls -q redis)
# 或者删除所有在 mongo:3.2 之前的镜像
docker image rm $(docker image ls -q -f before=mongo:3.2)

查看容器的存储层变动

docker diff

保存变化行程新的镜像

docker commit \
    --author "tpxcer" \
    --message "修改了默认网页" \
    webserver \
    nginx:v2

查看镜像内的历史记录

docker history nginx:v2

创建镜像

Dockerfile

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

创建镜像

# 注意,最后一个点是 docker 的打包目录, docker 将该目录下所有的文件都打包进镜像。
docker build -t nginx:v3 -f nginx-Dockerfile .

其他命令

# 查看镜像支持的环境变量
docker run IMAGE env

容器

查看容器

# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 如何获取某个容器的 PID 信息
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
何获取某个容器的 IP 地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>

运行容器

# 用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口
docker run --name webserver -d -p 80:80 nginx

停止容器

docker stop 容器名
# 停止所有正在运行的容器
docker stop $(docker container ls -q)

删除容器

docker container rm 容器名
# 批量清理已经停止的容器
docker container prune

容器其他设定

# 给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变
$ docker network create -d bridge --subnet 172.25.0.0/16 my-net
$ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
# 临时退出一个正在交互的容器的终端,而不终止它
按 Ctrl-p Ctrl-q。如果按 Ctrl-c 往往会让容器内应用进程终止,进而会终止容器。

Dockerfile 指令

EXPOSE 声明端口

仅声明端口

EXPOSE <端口1> [<端口2>...]

实际映射

EXPOSE -p <宿主端口>:<容器端口>  
# -p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

参考

Docker — 从入门到实践

Dockerfile reference

Best practices for writing Dockerfiles

0条评论
avatar