手机版
你好,游客 登录 注册
背景:
阅读新闻

Docker 快速入门

[日期:2017-10-07] 来源:locez.com  作者:Locez [字体: ]

1 Docker 是什么?

Docker 是一个开源的容器引擎,而一个容器其实是一个虚拟化的独立的环境,因此开发者可以将应用打包到这样的一个 docker 容器中,然后发布到任何可以运行 docker 容器的机器中,实现一次打包多处部署,解决了因为环境问题而导致的部署难题。

1.1 容器是什么?

与 容器 对应的一个概念就是 镜像,镜像可以看做我们平时装系统的镜像,里面就是一个运行环境。当然我比较喜欢将镜像比作一个我们面向对象编程中的 类,而一个容器就是一个类的 实例,因此可以根据一个镜像,创建出很多个容器。每一个容器都是具体的,我们可以在容器上面做出更改,然后再把这个容器打包成一个新的镜像,从而以后可以根据改动后的镜像创建出新的容器。而容器本身可以简单理解为是一个虚拟独立的运行环境,我们要做的是中这个环境中打包我们的应用,以便于再次部署。

2 安装 Docker

Gentoo

  1. # emerge --ask docker

CentOS

  1. #yum install docker-ce

Ubuntu

  1. #apt-get install docker-ce

Arch

  1. # pacman -S docker

2.1 启动 docker 守护进程

  1. #systemctl start docker

3 docker 命令介绍

  1. # docker --help
  2. 管理命令:
  3. container 管理容器
  4. image 管理镜像
  5. network 管理网络
  6. 命令:
  7. attach 介入到一个正在运行的容器
  8. build 根据Dockerfile构建一个镜像
  9. commit 根据容器的更改创建一个新的镜像
  10. cp在本地文件系统与容器中复制文件/文件夹
  11. create 创建一个新容器
  12. exec在容器中执行一条命令
  13. images 列出镜像
  14. kill杀死一个或多个正在运行的容器
  15. logs 取得容器的日志
  16. pause 暂停一个或多个容器的所有进程
  17. ps列出所有容器
  18. pull 拉取一个镜像或仓库到 registry
  19. push 推送一个镜像或仓库到 registry
  20. rename重命名一个容器
  21. restart 重新启动一个或多个容器
  22. rm删除一个或多个容器
  23. rmi 删除一个或多个镜像
  24. run 在一个新的容器中执行一条命令
  25. search DockerHub中搜索镜像
  26. start 启动一个或多个已经停止运行的容器
  27. stats 显示一个容器的实时资源占用
  28. stop 停止一个或多个正在运行的容器
  29. tag 为镜像创建一个新的标签
  30. top显示一个容器内的所有进程
  31. unpause 恢复一个或多个容器内所有被暂停的进程

在子命令中还有更多丰富的选项,可以使用 docker COMMAND --help 查看。例如:

  1. # docker run --help

4 docker 使用实战

接下来,我将利用 docker 部署一个 Nginx 服务器,作为讲解的例子。 要创建一个容器,那么我们必须先要有一个用于创建容器的镜像。 在 docker hub 中查找 nginx 相关镜像。

  1. # docker search nginx
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. nginx Official build of Nginx.6959[OK]
  4. jwilder/nginx-proxy AutomatedNginx reverse proxy for docker c...1134[OK]
  5. richarvey/nginx-php-fpm Container running Nginx+ PHP-FPM capable ...452[OK]
  6. ...
  7. ...

拉取官方镜像,其中上面的非官方镜像是用户们根据自己的需要制作的镜像,方便大家的使用。

  1. # docker pull nginx
  2. Usingdefault tag: latest
  3. latest:Pullingfrom library/nginx
  4. afeb2bfd31c0:Pull complete
  5. 7ff5d10493db:Downloading[===============>]6.651 MB/21.87 MB
  6. d2562f1ae1d0:Download complete

在这里顺便说一下,docker 镜像是分层存储的,所以上面的 nginx 镜像有 3 层,另外每根据新的容器制作一个新的镜像以后会给这个镜像加上一层。

接下来直接利用这个镜像启动一个新的容器:

  1. # docker run --name my-nginx -d -p 8080:80 nginx

此时中浏览器中输入:http://localhost:8080/ 即可访问 nginx。 参数解释:

  • --name 为容器取一个名字
  • -p 参数语法为 -p host port:container port; -p 8080:80 将主机上的8080端口绑定到容器上的80端口,因此在主机中访问8080端口时其实就是访问 nginx 容器的80端口
  • -d 后台运行容器

然后我们来看一个更复杂的例子:

  1. # docker run --name my-nginx \
  2. -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro \
  3. -v /some/html:/usr/share/nginx/html:ro \
  4. -p 8080:80 \
  5. -d nginx

这个例子多了一个参数 -v,这个参数的作用是把本地的文件或者文件夹挂载到容器中,其中最后面的 ro 或者 rw 控制这个挂载是否可写。

  • -v 参数语法为 -v host dir:container dir[:ro|rw]

上面的命令将本地文件中的 nginx.conf 配置文件挂载到容器,并且将要展示的静态页面也挂载到容器。 注意:在容器执行一条命令以后,当这个命令结束运行,容器也会结束运行。

接下来让我们看看 docker 别的命令。

查看所有运行中的容器:

  1. # docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 1fe91b5a4cd4 nginx "nginx -g 'daemon ..."39 minutes ago Up39 minutes 0.0.0.0:8080->80/tcp my-nginx
  4. # docker ps-a ### 列出包括未运行的容器

查看容器运行日志:

  1. # docker logs my-nginx
  2. 172.17.0.1--[05/Oct/2017:07:31:11+0000]"GET / HTTP/1.1"200612"-""Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0""-"
  3. 2017/10/0507:31:11[error]7#7:*1 open()"/usr/share/nginx/html/favicon.ico" failed (2:No such fileor directory), client:172.17.0.1, server: localhost, request:"GET /favicon.ico HTTP/1.1", host:"localhost:8080"

重启容器:

  1. # docker restart my-nginx
  2. my-nginx

停止运行一个容器:

  1. # docker stop my-nginx
  2. my-nginx
  3. # docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

启动一个已经存在的容器:

  1. # docker start my-nginx
  2. my-nginx
  3. # docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 1fe91b5a4cd4 nginx "nginx -g 'daemon ..."50 minutes ago Up3 seconds 0.0.0.0:8080->80/tcp my-nginx

直接杀死一个运行中的容器:

  1. # docker killmy-nginx

重命名容器:

  1. # docker renamemy-nginx new-nginx

删除容器:

  1. # docker rmnew-nginx

查看本机所有镜像:

  1. # docker imags

使用已经存在的容器创建一个镜像:

  1. # docker commit -m "nothing changed"my-nginx my-nginx-image
  2. sha256:f02483cdb842a0dc1730fe2c653603fa3271e71c31dbb442caccd7ad64860350
  3. # docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. my-nginx-image latest f02483cdb842 6 seconds ago 108 MB
  6. nginx latest da5939581ac8 3 weeks ago 108 MB

使用我们自己创建的镜像创建容器:

  1. # docker run --name test-d -p 8081:80my-nginx-image
  2. 12ba86eabdef0121d875bdb547f1101d4eb54ff7cb36e20214fb1388659af83d
  3. # docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 12ba86eabdefmy-nginx-image "nginx -g 'daemon ..."7 seconds ago Up5 seconds 0.0.0.0:8081->80/tcp test
  6. 299f4ede9e79 nginx "nginx -g 'daemon ..."11 minutes ago Up11 minutes 0.0.0.0:8080->80/tcp my-nginx

如果我们使用的容器的启动命令是一个 shell ,那么我们可以使用 attach 命令来介入这个容器,就跟我们使用 ssh 连接一台服务器差不多。

  1. # docker attach some-container

在创建一个容器时直接启动一个可交互式的 shell, 并且退出后自动删除容器:

  1. # docker run -it --rm centos

总结

本文介绍了 docker 的简单用法,同时也给出了一个实际的例子用来展示 docker 命令的各种操作。作为一个快速入门的文章,本文写的相对有点简单,很多概念上的东西还需要求查看别的资料理解,但是看完本文应该就具备使用 docker 的基本能力了。此外,后续的文章应该会写一点 Dockerfiledocker-compose 相关的内容。

更多Docker相关教程见以下内容: 

Docker安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

Ubuntu 16.04 服务器上配置使用 Docker  http://www.linuxidc.com/Linux/2017-06/145176.htm 

Ubuntu 15.04下安装Docker  http://www.linuxidc.com/Linux/2015-07/120444.htm 

Docker 安装实例 http://www.linuxidc.com/Linux/2017-04/142666.htm 

Docker 创建基础镜像  http://www.linuxidc.com/Linux/2017-05/144112.htm 

在 Ubuntu 15.04 上如何安装Docker及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm 

Ubuntu 16.04上Docker使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm 

使用Docker分分钟启动常用应用  http://www.linuxidc.com/Linux/2017-04/142649.htm 

Ubuntu 16.04下Docker修改配置文件不生效解决办法  http://www.linuxidc.com/Linux/2017-05/143862.htm 

Docker 的详细介绍请点这里
Docker 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-10/147329.htm

linux
相关资讯       Docker入门  Docker 快速入门 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款