拉取镜像:
上篇文章 Docker 入门安装教程 中讲了 Docker 最重要的一部分就是就是 Docker 镜像,我们所有的容器都是基于 Docker 镜像来创建的,这样才能保证所有同一个镜像创建出来的容器是一模一样的。而我们的容器则放在仓库中,Docker Hub 就是一个官方公开的仓库,里面有非常多的镜像。我们可以直接使用官方仓库中的镜像来创建容器,下面我们就来创建一个 nginx 容器。
使用 docker search nginx 命令来搜索镜像,可以看到搜索出来非常多的结果,注意,OFFICIAL 那栏标记 OK 的就表示这个镜像是 nginx 官方制作的镜像。
也可以直接到 Docker Hub 上去搜索镜像,可以更直观的看到镜像的信息。比如这里就提供了该镜像在 Github 上存放的对应不同的 tag 的 Dockerfile 文件,Dockerfile 文件就是用来生成镜像用的,后续再讲怎么使用。一个 tag 就代表一个版本的镜像,因为 nginx 也有很多不同的版本,在拉取镜像的时候可以指定版本,如果没指定则默认拉取 latest 版本的镜像。
下面使用 docker pull 命令拉取 tag 为 1.15.8 的 nginx 镜像。下载会需要一点时间,然后使用 docker images 命令来查看本地存在的镜像,发现已经有一个 tag 为 1.15.8 的 nginx 镜像了。
运行容器:
使用这个镜像运行起一个容器,运行 docker run -d -p 9500:80 –name nginx nginx:1.15.8,对外映射的端口是 9500,这里先不探究这些命令参数的含义,后续再细讲。使用 docker ps 命令来查看运行的容器,发现有一个名为 nginx 的容器,试着访问下,是可以成功打开 nginx 的主页。到现在为止我们已经成功的在官方仓库拉取一个镜像并通过镜像来运行起了一个容器。
运行 Docker 容器:
在拉取了 Docker 镜像之后我们可以使用 docker run [镜像名:tag] 命令来运行一个容器,这个命令后面可以添加参数来进行不同的操作,这里只简单介绍下上面用到的。
-p 9500:80 这个参数的含义就是把容器的 80 端口映射到宿主机的 9500 端口,这样访问宿主机的 9500 端口就可以访问到 nginx 所在的容器了。
–name nginx 为这个容器起一个名字。
-d 后台运行。
Docker 容器和宿主机共享数据:
因为容器是随时可以抛弃的,但是例如 nginx 和 mysql 这类需要存放数据的容器如果直接抛弃了旧的容器使用新的容器就会造成原来的数据丢失,所以就需要让这类容器的数据是和宿主机的某个目录下共享的,这样即使就容器删除了,新的容器只要指定数据的使用路径依旧可以使用旧容器的数据。只需要在运行容器时使用 - v 参数即可。
使用这条命令运行容器时,会将容器这个目录下的数据共享到宿主机 /var/lib/docker/volumes/ 目录下,会自动生成一个随机目录。
docker run -d -p 9500:80 -v /etc/nginx/html –name nginx nginx:1.15.8
可以使用 docker inspect nginx 或 docker inspect –format={{.Mounts}} nginx 命令来查看随机挂载到了宿主机哪个目录
如果不想使用随机目录,也可以自己指定目录,使用冒号隔开即可,前面的是宿主机的目录,后面是容器的目录。
docker run -d -p 9500:80 -v /usr/local/half/nginx/html:/etc/nginx/html –name nginx nginx:1.15.8
启动容器时使用自己的配置文件:
其实在镜像里面已经配置好了默认的配置文件路径,后续会讲到如何去查看这些配置路径。在 nginx 容器中配置文件的默认是 /etc/nginx/nginx.conf,而在默认的配置文件里又讲页面的目录设置在了容器中的 /etc/nginx/html 中,所以其实可以使用上面的 - v 参数来使用自己的配置文件。
使用 - v 参数替换默认的配置文件,下面的命令中第一个 - v 参数是使用宿主机 /usr/local/half/nginx/ nginx.conf 来替换了默认的配置文件,这是我提前创建好的一个 nginx 配置文件。在那里面我指定了将 /etc/nginx/html 目录作为页面的根目录,而第二个 - v 命令则是把这个目录挂载到宿主机下的 /usr/local/half/nginx/html 目录,那里面有一个自定义的 index.html 文件。所以这样一来当我们再访问这个容器时会发现主页是跳转到自定义的页面上。
docker run -d -p 9500:80 -v /usr/local/half/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/half/nginx/html:/etc/nginx/html –name nginx nginx:1.15.8
而且因为我们把配置文件和存放页面的路径全都挂载在了宿主机的目录下,如果我们需要修改什么配置,只需要修改完之后再启动一个新的容器就可以了。
进入到容器内部:
因为镜像其实是根据 Dockerfile 构建出来的,官方的镜像也是如此,很多时候我们或许不清楚默认的配置路径,除了查文档和资料外还可以直接进入容器内部来查看。
运行 docker exec -i -t nginx /bin/bash 命令就可以进入到容器内部,我们会发现其实即使一个简化版的 Linux 系统,所以我们可以使用一些基本的 Linux 命令来查询各种想要知道的信息。
Dockerfile:
Dockerfile 文件是专门用来创建镜像的,最开始 Docker Hub 页面上也提供了 Dockerfile 文件在 Github 上的路径,例如 nginx 的 Dockerfile。我个人对 Dockerfile 的理解就是把所用的下载和各种路径的配置都按顺序写好在 Dockerfile 文件中,然后再使用它构建出镜像。其实上面使用的 - v 等命令都是对应着 Dockerfile 中不同的指令,只不过是以命令行的方式调用了,覆盖了 Dockerfile 中的指令配置。这里就不作详细说明,如果有想要了解的可以阅读 << 第一本 Docker 书 >> 里面很详细的讲了 Dockerfile 的使用。
Docker 常用命令:
查看 Docker 信息,sudo docker info
查看 Docker 镜像,sudo docker images
查看 Docker 启动的容器,sudo docker ps
查看 Docker 所有的容器,sudo docker ps -a
删除 Docker 中某个容器,sudo docker rm [容器名字或 id]
删除 Docker 中所有的容器 (查询出所有的容器 id, 传到 rm 命令中),sudo docker rm $(sudo docker ps -a -q)
删除 Docker 中某个镜像,sudo docker rmi [镜像名字或 id]
强制删除 Docker 中某个镜像,sudo docker rmi -f [镜像名字或 id]
查找仓库中的镜像,sudo docker search [镜像名字]
拉取仓库中的镜像,sudo docker pull [镜像名字]
登录 Docker Hub 账号,sudo docker login
推送镜像到 Docker Hub 仓库,sudo push [仓库 / 镜像名字:tag]
总结:
Docker 在如今越来越流行,除了运维人员之外,后台开发也很有必要熟悉它,它可以极大的简化服务器的部署,本文只是粗略的介绍了基本使用,大家可以阅读 << 第一本 Docker 书 >> 或者是官方文档等资料去了解更多更高级的功能。