docker容器基础使用与技巧

拉取镜像与创建容器

docker pull 拉取镜像

我们可以用docker images来查看系统已经获取过的镜像。

user@yourpc:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B

表中意义分别是:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

如果我们想拉取镜像站中的一个新镜像,那就运行docker pull命令

 docker pull ubuntu:20.04

ubuntu是镜像名,20.04是镜像tag,不填的话就是默认:latest。
成功后再运行docker images就能发现多了一条

user@yourpc:~$ docker images           
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              20.04               d5ca7a445605        2 years ago         65.6MB

在pull一个远端镜像前,也可以提前查一下有哪些相关镜像,执行

user@yourpc:~$ docker search httpd
NAME                             DESCRIPTION                                     STARS     OFFICIAL
httpd                            The Apache HTTP Server Project                  4688      [OK]
clearlinux/httpd                 httpd HyperText Transfer Protocol (HTTP) ser…   5
paketobuildpacks/httpd                                                           0
vulhub/httpd                                                                     0
jitesoft/httpd                   Apache httpd on Alpine linux.                   0
openquantumsafe/httpd            Demo of post-quantum cryptography in Apache …   12
wodby/httpd                                                                      0
dockette/httpdump                                                                0
betterweb/httpd                                                                  0

在这里我们可以看见有关的镜像名字、简单描述,以及是否是官方镜像。

创建并运行容器

交互式运行容器

最简单的创建并运行的容器的命令:

docker run -it ubuntu /bin/bash
  • run 是创建并运行容器的命令选项;
  • -i 指interactive,以交互的形式运行容器;
  • -t 指terminal, 以终端的形式运行容器;-it是常用组合
  • ubuntu指使用Ubuntu镜像创建容器;
  • /bin/bash 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

想要退出交互环境,输入exit就可以退出了。
查看运行中的容器/查看所有存在的容器(无论是否运行)使用下列命令:

docker ps       #查看运行中的容器
docker ps -a    #查看所有容器

容器的启动停止等管理和systemd类似:

docker start 容器id/name      #开启容器
docker stop 容器id/name           #停止容器
docker restart 容器id/name        #重启容器

后台运行容器

当我们希望容器表现的像个服务,安静的在后台运行时,可以通过参数 -d 指定

docker run -itd --name ubuntu.1 ubuntu /bin/bash
  • -d 指定容易运行在后台;
  • –name 赋予容器名字,可以更方便的管理

想要查看运行中的容器其中的进程,可以用docker top 容器id/name命令。

进入一个容器

运行在后台的容器,我们也经常会有调试设置的时候,这时候就需要我们能够进入容器触及里面的文件,推荐使用 docker exec 命令,因为exec退出后容器会继续运行,像是一种热交互。

docker exec -it ubuntu.1 /bin/bash
  • -it 仍然指交互式终端运行;
  • ubuntu.1 是要进入的容器名字,换成id也可;
  • /bin/bash 进入容器要执行的命令;

这样我们就能以root用户的身份,进入指定容器的终端,也就能操作容器内的文件了。

包含文件/端口映射的容器创建

虽然我们已经有方法进入容器内部了,但是还有一些情况,我们不希望容器和我们的主机过分隔绝

  1. 配置文件需要频繁调试,每次靠docker exec太麻烦;
  2. 容器内部会有较大文件,不希望容器体积过大,希望把容器内部数据挂载在主机上;
  3. 应用服务需要以端口形式暴露到主机端口,才能让我们或者别的进程访问;

所以更多的时候,我们创建容器时,需要指定一些容器和主机的”联通管道“。以运行nginx容器为例:

docker run --name nginx.1 -p 80:80 -v --restart=always /home/user/nginx/conf.d:/etc/nginx/conf.d -d nginx
  • -p 主机port:容器port 将容器的端口映射到主机的端口,这样访问主机ip:主机port就可以访问容器内的服务了;
  • -v 主机路径:容器路径 将容器内的文件路径映射到主机路径,这样容器调用此路径时就会调用主机的文件,我们修改配置文件就直接修改主机路径下的文件即可(注意挂载文件路径时,要保证主机目录下有完整的应有文件,推荐先复制容器内文件出来,再映射,具体见下文);
  • –restart=always 设置容器随docker服务启动而自启动。

容器管理技巧

上文提到有时我们需要修改容器内部的文件,那么第一简单的方式就是在容器内部安装vim

A

docker exec -it 容器ID /bin/bash
apt-get update
apt-get install vim

B

但是有些容器内部连apt工具也没有,那么我们就只能间接的修改了,那就是把文件从容器里面copy到主机,在主机完成修改后再copy回去。

1.copy容器文件到主机
docker cp 容器id/name:container_filepath local_filepath
2.修改文件
3.copy主机文件到容器
docker cp local_filepath  容器id/name:container_filepath

C

一种更一劳永逸的方式就是把容器内部的文件夹映射到主机上,这样以后直接在主机修改文件内容,容器调用的时候就会直接调用主机上的文本。注意在映射前,把容器中文件夹中的文件全部copy到主机路径下,这样再去挂载比较稳妥,否则有可能会出现容器找不到需要的文件而报错的情况。
以nginx容器为例,记录一下全过程:

1.创建一个辅助容器
docker run --name nginx.0 -p 80:80 -d nginx
2.copy容器路径下全部文件到主机路径
docker cp nginx.0:/etc/nginx/conf.d /home/user/nginx/
3.停止并删除辅助容器
docker stop nginx.0 && docker rm nginx.0
4.创建映射文件的容器
docker run --name nginx.1 -p 80:80 -v --restart=always /home/user/nginx/conf.d:/etc/nginx/conf.d -d nginx

至于怎么知道容器里的文件路径时怎么样的,可以docker exec进容器里面去找;或者访问Dockerhub去找这个镜像的官方文档,好的文档里面会介绍重要文件的路径和镜像的使用tips。

docker file与docker compose

还有更优雅的方式创建并管理容器,那就是docker file和docker compose的方法。
具体在另一篇文章记录。