Skip to main content

Docker 基本使用

Docker容器提供了独立的程序运行环境,用户通过使用不同的Docker镜像,拥有了独立的运行环境,包括使用自己熟悉的Linux发行版(centos、ubuntu等等),使用自己需要的软件版本等等,给生信分析带来了诸多便捷;详细技术介绍可以参考Docker官方网站(https://docs.docker.com)。

一. Docker的几个重要概念

  • 镜像:指一个静态的系统环境,用户可以创建、删除。
  • 容器:容器是系统的一个实例,即运行着某一条或一些命令的系统。
  • Docker服务:Docker镜像资源的使用依托于Docker服务,北鲲云所有Linux节点均已预装Docker服务。
  • 宿主机:指运行Docker服务的机器,如北鲲云平台的Linux工作站。

二. 使用docker启动一个Ubuntu系统的容器

Step 1. 拉取最新版本的Ubuntu镜像;

Docker默认获取最新镜像版本,但也可以指定我们想要的版本,例如: docker pull ubuntu:14.04。

docker pull biodckrdev/bowtie:1.1.2

Step 2. 使用该镜像启动一个容器;

显示 "root@4ff0be4995f0:/#" 意味着我们在Ubuntu容器里面了,并且是root用户,可以在Ubuntu终端做任何事情。

docker run -it ubuntu

Step 3. 可以查看到该系统的版本;

root@85e11a12160f:/# cat /etc/issue
Ubuntu 20.04.3 LTS \n \l

三.常用的 docker容器相关指令

1.创建容器(create)

docker create :创建一个新的容器但不启动它;如果本地镜像中有容器,则直接创建,如果本地没有镜像则会去官方下载相应的镜像。

语法

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

实例

使用docker镜像ubuntu:20.04创建一个容器,并将容器命名为myubuntu

runoob@runoob:~$ docker create  --name myubuntu  ubuntu:20.04

2.查看已创建的容器(ps,ls,list)

docker ps : 列出容器;"ls", "ps", "list"均是别名信息。

语法

docker ps [OPTIONS]
  • OPTIONS说明:
    • -a : 显示所有的容器,包括未运行的。
    • -f : 根据条件过滤显示的内容。
    • --format : 指定返回值的模板文件。
    • -l : 显示最近创建的容器。
    • -n : 列出最近创建的n个容器。
    • --no-trunc : 不截断输出。
    • -q : 静默模式,只显示容器编号。
    • -s : 显示总的文件大小。

实例

列出所有在运行的容器信息。

runoob@runoob:~$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
09b93464c2f7 nginx:latest "nginx -g 'daemon off" ... 80/tcp, 443/tcp myrunoob
96f7f14e99ab mysql:5.6 "docker-entrypoint.sh" ... 0.0.0.0:3306->3306/tcp mymysql
  • 输出详情介绍:

    • CONTAINER ID: 容器 ID。
    • IMAGE: 使用的镜像。
    • COMMAND: 容器的初始化命令,该命令和镜像的默认设置有关,当然,在启动容器时我们时可以修改的。
    • CREATED: 创建的时间。
    • STATUS: 当前的状态。
    • PORTS: 对外暴露的端口。
    • NAMES: 容器的名称,若不指定,则docker引擎会自动帮咱们随机生成一个容器名称。
  • STATUS状态有七种

    • created(已创建)
    • restarting(重启中)
    • running(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)

3.运行一个已创建的容器(start),停止一个正在运行的容器(stop),重启容器(restart)

docker start :启动一个或多个已经被停止的容器

docker stop :停止一个运行中的容器

docker restart :重启容器

语法

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]

实例

启动已被停止的容器myrunoob

docker start myrunoob

停止运行中的容器myrunoob

docker stop myrunoob

重启容器myrunoob

docker restart myrunoob

4.创建并启动一个容器(run,等效于"create + start")

docker run : 创建一个新的容器并运行一个命令

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 常用OPTIONS说明:
    • -i :即"interactive",表示交互式的类型。通常和"-t"选项搭配使用。
    • -t :即"terminal",表示启动一个终端。通常和"-i"选项搭配使用。
    • -d :让容器在后台运行,默认情况下,容器是在前台(当前终端)运行的,这意味着会阻塞当前终端。
    • --name :创建容器时指定名称。
    • -P :随机端口映射,容器内部端口 随机 映射到主机的端口
    • -p :指定端口映射,格式为:主机(宿主)端口:容器端口

实例

使用docker镜像ubuntu:20.04以后台模式启动一个容器,并将容器命名为myubuntu。
docker run --name myubuntu -d ubuntu:20.04

使用镜像ubuntu:20.04以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d ubuntu:20.04

使用镜像 ubuntu:20.04,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d ubuntu:20.04

绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像ubuntu:20.04以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it ubuntu:20.04 /bin/bash
root@b8573233d675:/#

5.删除容器(rm)

docker rm :删除一个或多个容器。

语法

docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • OPTIONS说明:
    • -f : 通过 SIGKILL 信号强制删除一个运行中的容器。
    • -l : 移除容器间的网络连接,而非容器本身。
    • -v : 删除与容器关联的卷。

实例

强制删除容器 db01、db02:docker rm -f db01 db02
移除容器 nginx01 对容器 db01 的连接,连接名 db:docker rm -l db
删除容器 nginx01, 并删除容器挂载的数据卷:docker rm -v nginx01
删除所有已经停止的容器:docker rm $(docker ps -a -q)

6.显式正在运行的容器中进程信息(top)

docker top :查看容器中运行的进程信息,支持 ps 命令参数。

语法

docker top [OPTIONS] CONTAINER [ps OPTIONS]

容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。

实例

查看容器mymysql的进程信息。
runoob@runoob:~/mysql$ docker top mymysql
UID PID PPID C STIME TTY TIME CMD
999 40347 40331 18 00:58 ? 00:00:02 mysqld

查看所有运行容器的进程信息。
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

7.获取容器的启动日志(logs)

语法

docker logs [OPTIONS] CONTAINER
  • OPTIONS说明:
    • -f : 跟踪日志输出
    • --since : 显示某个开始时间的所有日志
    • -t : 显示时间戳
    • --tail : 仅列出最新N条容器日志

实例

跟踪查看容器mynginx的日志输出。

runoob@runoob:~$ docker logs -f mynginx
192.168.239.1 - - [10/Jul/2016:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
2016/07/10 16:53:33 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client:
...

查看容器mynginx从2022年10月1日后的最新10条日志。

docker logs --since="2022-10-01" --tail=10 mynginx

四.常用的 docker镜像相关指令

1.下载镜像(pull)

docker pull ubuntu:20.04 指定版本下载
docker pull ubuntu 不指定默认下载最新版本

2.上传镜像(push)

docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

语法

docker push [OPTIONS] NAME[:TAG]

实例

上传本地镜像myapache:v1到镜像仓库中。

docker push myapache:v1

3.查看本地镜像列表(ls)

docker images
docker image ls

4.导出镜像(save)

docker save ubuntu:20.04 -o docker.ubuntu:20.04.tar.gz

5.导入镜像(load)

docker image load -i docker.ubuntu:20.04.tar.gz

6.删除镜像(rm)

docker image rm 镜像ID

注意事项:

(1)可以基于镜像的ID来删除指定的镜像文件,当然,也可以基于镜像名称和TAG编号一起删除;
(2)很明显"docker image rm""docker rmi","docker remove"多个别名哟;
(3)使用"docker rm"删除的是容器哟,而非镜像;
(4)想要批量删除镜像,可以先停止docker服务,然后将"/var/lib/docker/*"目录全部删除,这意味着对docker进行初始化操作,因为它意味着删除了所有数据,该操作是不可逆的。

7.镜像打标签(tag)

docker tag : 标记本地镜像,将其归入某一仓库。

语法

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

实例

将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。

root@runoob:~# docker tag ubuntu:15.10 runoob/ubuntu:v3
root@runoob:~# docker images runoob/ubuntu:v3
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v3 4e3b13c8a266 3 months ago 136.3 MB

8.清除无效镜像(prune)

无效的镜像指的就是没有镜像名称和标签的。

docker image prune 

五.常用的Dockerfile指令

  • FROM: 构建的镜像设置基础镜像
  • RUN: 在镜像的构建过程中执行特定的命令,并生成一个中间镜像。比如安装一些软件、配置一些基础环境,可使用\来换行。
  • CMD: 指定容器运行时的默认参数。
  • LABEL: 给构建的镜像打标签。
  • EXPOSE: 为构建的镜像设置监听端口。
  • ENV: 在构建的镜像中设置环境变量,在后续的Dockerfile指令中可以直接使用,也可以固化在镜像里,在容器运行时仍然有效。
  • ADD: 构建镜像时,复制上下文中的文件到镜像内。
  • COPY: 将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。
  • ENTRYPOINT: 指定镜像的执行程序。
  • VOLUME: 指定镜像内的目录为数据卷。
  • WORKDIR: 为接下来的Dockerfile指令指定当前工作目录,可多次使用,如果使用的是相对路径,则相对的是上一个工作目录,类似shell中的cd命令。