小豹子的网络记事本

记录每一个有意思的细节

Docker - 快速入门(一)

概念

下面这三个概念一开始可能不好理解,等大家跟着博客把例子做完了,再回头来看应该就能理解了。

docker image  # docker镜像
镜像就是一个只读的模板。镜像可以用来创建Docker容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

docker container  # docker容器
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

docker repository  # docker仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

 

docker安装

系统要求(下段英文截取至官方文档)
OS requirements
To install Docker CE, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.
可能有些文章说centos6也能运行,不过我没有测试,我这里使用的是CentOS7
[root@dockhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

使用yum安装
[root@dockhost ~]# yum -y install docker-io

开机自动启动
[root@dockhost ~]# systemctl enable docker

启动docker
[root@dockhost ~]# systemctl start docker

查看docker信息
[root@dockhost ~]# docker --version
Docker version 1.13.1, build b2f74b2/1.13.1

查看更加详细的信息
[root@dockhost ~]# docker info

查看帮助文档
[root@dockhost ~]# docker  # 查看所有命令帮助
[root@dockhost ~]# docker container --help  # 如果想知道container的有哪些命令,可以使用这个帮助

 

docker使用

接下来使用一个例子(简单nginx服务)来演示如何使用docker,为避免混乱全部使用英文,image:镜像,container:容器

查看docker image
[root@dockhost ~]# docker image ls 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
因为docker才安装,所以没有任何image,docker image ls与docker images命令等价

查看正在运行的docker container
[root@dockhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
连image都没有,当然也就没有container了,因为只有运行了image才会产生container,docker container ls与docker ps命令等价

查看所有container,包括没有运行的container
[root@dockhost ~]# docker container ls --all
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
该命令与上一条命令的区别就是,加--all会把所有container显示出来,docker container ls --all与docker ps -a命令等价

下载nginx image
[root@dockhost ~]# docker pull nginx

Using default tag: latest
Trying to pull repository docker.io/library/nginx ... 
latest: Pulling from docker.io/library/nginx
743f2d6c1f65: Pull complete 
6bfc4ec4420a: Pull complete 
688a776db95f: Pull complete 
Digest: sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
Status: Downloaded newer image for docker.io/nginx:latest

 

此时再来查看docker image,就能看到当前主机上有一个nginx image了
[root@dockhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              53f3fd8007f7        3 weeks ago         109 MB

 

运行nginx image
[root@dockhost ~]# docker run -p 8080:80 -d nginx
47511fe91ce243583e7300bb143f9d15755c175b3a33405db92158e596d61f68
这里的参数-p表示端口映射,前面的8080为我自定义的主机端口,后面的80是docker里面的nginx服务默认端口,docker里面的端口只有映射出来,本机或其它机器才能访问得到。具体是8080还是其它端口,这个自己定义。
-d表示把命令放到后台执行,前端返回一个数字,具体数字表示什么含义后面有介绍

再来查看docker container,可以看到有一个正在运行的container了,而CONTAINER ID就是上一步中返回的数字的截断
[root@dockhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
47511fe91ce2        nginx               "nginx -g 'daemon ..."   9 minutes ago       Up 9 minutes        0.0.0.0:8080->80/tcp   stoic_easley

 

打开浏览器,输入你docker运行的主机ip:8080,显示了nginx的欢迎界面。到这儿大家就应该知道docker的作用了,docker就是把别人做好的一段程序或应用打包,你拿来直接使用。

1


接下来我通过更改container里面的nginx欢迎界面文件,来介绍如何修改别人的image
新建一个index.html,下面三行为index.html的内容
<html>
<p1>hello, I change index file.</p1>
</html>

上传到container中,命令有点类似于scp
[root@dockhost ~]# docker cp index.html 47511fe91ce2:/usr/share/nginx/html  # 47511fe91ce2为前面docker ps命令显示的CONTAINER ID
刷新浏览器,显示"hello, I change index file.",表示刚才做了的更改生效了

2

停止docker container
[root@dockhost ~]# docker stop 47511fe91ce2  # 47511fe91ce2为前面docker ps命令显示的CONTAINER ID
47511fe91ce2

查看container,此时发现无任何container运行
[root@dockhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS

使用docker ps -a可以看到所有container,包括前面stop掉的
[root@dockhost ~]# docker ps –a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
47511fe91ce2        nginx               "nginx -g 'daemon ..."   24 minutes ago      Exited (0) About a minute ago                       stoic_easley

 

重新运行nginx image
[root@dockhost ~]# docker run -p 8080:80 -d nginx
f784361b43448453cbf646b2fc1eb52d943baca3848dbc08fa6d0446b2942d03

查看docker container
[root@dockhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                  NAMES
f784361b4344        nginx               "nginx -g 'daemon ..."   56 seconds ago      Up 55 seconds              0.0.0.0:8080->80/tcp   elated_bose
47511fe91ce2        nginx               "nginx -g 'daemon ..."   27 minutes ago      Exited (0) 4 minutes ago                          stoic_easley

 

发现有两个container,从status这列中可以看到,第一个是正在运行,第二个是四分钟前退出,每次运行image,都会创建一个新的container。

再刷新浏览器,竟然又显示了nginx的欢迎界面

1

也就是说之前所做的修改,重启之后就失效了,原因是因为修改是针对container的,重新运行image,container id就变了,是个新的container了。如果想永久保存这些变化,可以使用下面的命令

重新将index.html上传到container中,注意这里是正在运行的CONTAINER ID
[root@dockhost ~]# docker cp index.html f784361b4344:/usr/share/nginx/html
此时你可以刷新浏览器看下,现在应该显示"hello, I change index file."

保存修改
[root@dockhost ~]# docker commit -m 'change html' f784361b4344 'new_nginx'
sha256:f7de2c5040239142857aa9fdc6f4ed55bf2462fe9be97d8139978965f7a8065c
这个命令放到下一步解释

再来查看docker image
[root@dockhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
new_nginx           latest              f7de2c504023        40 seconds ago      109 MB
docker.io/nginx     latest              53f3fd8007f7        3 weeks ago         109 MB

可以看到这时候多了一个image,现在解释下docker commit这个命令
-m 'change html','change html'是描述符,实际意义不大
f784361b4344,需要保存更改的container id
'new_nginx',实际上永久更改container,就是重新创建了一份image文件,new_nginx就是一个新的image文件名字。可以看文章最开始的image介绍,image是个只读的模板,运行image就启动了container,更改container就重新创建image

现在停掉前面的container
[root@dockhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f784361b4344        nginx               "nginx -g 'daemon ..."   11 minutes ago      Up 11 minutes       0.0.0.0:8080->80/tcp   elated_bose

 

[root@dockhost ~]# docker stop f784361b4344
f784361b4344

再打开new_nginx image
[root@dockhost ~]# docker run -p 8080:80 -d new_nginx
ebbba295fe241012325564872a90c8537d431e3f13ea154c7faec6b7c142d42e
[root@dockhost ~]# docker ps  # 查看正在运行的container

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
ebbba295fe24        new_nginx           "nginx -g 'daemon ..."   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   vigilant_yalow

 

刷新浏览器,显示"hello, I change index file.",也就是说改动生效了,不过不是在nginx image中,而是后面创建的new_nginx image。

2


删除container使用docker rm <CONTAINER ID>
[root@dockhost ~]# docker ps -a  # 查看所有的container

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
ebbba295fe24        new_nginx           "nginx -g 'daemon ..."   2 minutes ago       Up 2 minutes                0.0.0.0:8080->80/tcp   vigilant_yalow
f784361b4344        nginx               "nginx -g 'daemon ..."   55 minutes ago      Exited (0) 36 minutes ago                          elated_bose
47511fe91ce2        nginx               "nginx -g 'daemon ..."   About an hour ago   Exited (0) 59 minutes ago                          stoic_easley

 

[root@dockhost ~]# docker rm f784361b4344  # 删除id为f784361b4344的container
f784361b4344

[root@dockhost ~]# docker ps -a  # 可以看到id为f784361b4344的container已经被删除了

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS                  NAMES
ebbba295fe24        new_nginx           "nginx -g 'daemon ..."   4 minutes ago       Up 4 minutes                   0.0.0.0:8080->80/tcp   vigilant_yalow
47511fe91ce2        nginx               "nginx -g 'daemon ..."   About an hour ago   Exited (0) About an hour ago                          stoic_easley

 

这里需要注意的是不能删除一个正在运行的container
[root@dockhost ~]# docker rm ebbba295fe24

Error response from daemon: You cannot remove a running container ebbba295fe241012325564872a90c8537d431e3f13ea154c7faec6b7c142d42e. Stop the container before attempting removal or use -f

 

删除image
[root@dockhost ~]# docker images  # 列出所有镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
new_nginx           latest              f7de2c504023        49 minutes ago      109 MB
docker.io/nginx     latest              53f3fd8007f7        3 weeks ago         109 MB

 
[root@dockhost ~]# docker rmi nginx  # 这里提示不能删除nginx image,由于有container与其绑定,即使该container已经停掉了

Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 47511fe91ce2 is using its referenced image 53f3fd8007f7

 

[root@dockhost ~]# docker rm 47511fe91ce2  # 删除nginx image相关的container
47511fe91ce2

[root@dockhost ~]# docker rmi nginx

Untagged: nginx:latest
Untagged: docker.io/nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68

 

[root@dockhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
new_nginx           latest              f7de2c504023        54 minutes ago      109 MB

这时nginx的镜像就已经被删除了

 

好了,docker常用的操作就都演示完了,下面来个总结
docker pull 获取image
docker build 创建image 
# 这个命令本文没讲,篇幅有限,感兴趣可以搜其它的文章
docker images 列出image
docker run 运行container
docker ps 列出container
docker rm 删除container
docker rmi 删除image
docker cp 在host和container之间拷贝文件
docker commit 保存改动为新的image

其它命令
向容器里面执行命令:docker exec -it <CONTAINER_ID> bash
如:[root@dockhost ~]# docker exec -it ebbba295fe24 ls

bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

 

容器与本地服务器互拷文件或文件夹
从容器到本地:docker cp <containerId>:/file/path/within/container /host/path/target
从本地到容器:docker cp filename <containerId>:/file/path/within/container

删除docker安装程序

rpm -qa | grep docker | xargs rpm -ev --nodeps
rm -rf /var/lib/docker

 

posted @ 2019-05-30 09:10  小豹子加油  阅读(291)  评论(0编辑  收藏  举报