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命令。