资源


简介 http://dockone.io/article/2110
入门教程 @阮一峰 http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
常用命令合集 https://segmentfault.com/a/1190000012063374

官方文档
https://docs.docker.com/
https://docs.docker.com/reference/

docker hub
https://hub.docker.com/

基本概念

image
container

将镜像实例化启动起来就是容器

安装

https://docs.docker.com/install/
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)

基本用法

  1. docker --help
  2. docker [command] help
  1. service docker start # 启动服务
  2. docker images # 查看本机上的所有镜像
  3. docker run [imageName] # 会自动拉取 image, 相当于 docker create 加 docker start
  4. docker image rm ${image_id} # 删除某个镜像
  5. docker ps # 查看运行中的 container
  6. docker ps -a #包括终止运行的容器
  7. # 启动某个 container
  8. docker start ${container_id}
  9. # 停止某个 container
  10. docker stop ${container_id}
  11. # 重启某个 container
  12. docker restart ${container_id}
  13. # 删除某个 container
  14. docker rm ${container_id}

image和container常用操作

将 image 文件从仓库抓取到本地
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略

  1. docker image pull library/hello-world
  2. docker image pull hello-world
  3. docker image ls
  4. docker image rm [imageName]


从dockerfile创建image

  1. docker image build -t koa-demo .
  2. docker image build -t koa-demo:0.0.1 .



docker container run命令具有自动抓取 image 文件的功能。
如果发现本地没有指定的 image 文件,就会从仓库自动抓取。
因此,前面的docker image pull命令并不是必需的步骤

  1. docker container run [imageName]
  2. docker container run -p 8000:3000 -it koa-demo /bin/bash


-it参数:容器的 Shell 映射到当前的 Shell
—rm container结束后自动rm (两个-, 不加这个选项的话默认不会rm)
最后那里是容器启动后第一个执行的命令, “/bin/bash”保证shell被启动
也可以写成Dockerfile里面的CMD

启动已有的container

  1. docker container start [containerID]
  1. docker container ls
  2. docker ps # 等价
  3. docker container ls --all #包括终止运行的容器
  4. docker ps -a # 等价

https://docs.docker.com/engine/reference/commandline/ps/

  1. docker container kill [containID] # SIGKILL
  2. docker container stop [containID] # SIGTERM SIGKILL
  3. docker container rm [containerID]


如果run的时候没加-it, 则以下命令可以打印container的标准输出, 以及执行命令

  1. docker container logs [containerID]
  2. docker container exec -it [containerID] /bin/bash


从container复制文件

  1. docker container cp [containID]:[/path/to/file] .


其他命令

  1. docker container --help

发布image文件

hub.docker.comcloud.docker.com 注册一个账户

  1. docker login


接着,为本地的 image 标注用户名和版本。

  1. docker image tag [imageName] -t [username]/[repository]:[tag]
  2. docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1


也可以不标注用户名,重新构建一下 image 文件。

  1. docker image build -t [username]/[repository]:[tag] .


最后,发布 image 文件。

  1. docker image push [username]/[repository]:[tag]


发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。

compose工具

https://docs.docker.com/compose/

保存对容器的修改

https://docs.docker.com/engine/reference/commandline/commit/

commit生成一个新的image

  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]


Commit a container with new configurations

  1. docker commit --change "ENV DEBUG true" c3f279d17e0a svendowideit/testimage:version3


Commit a container with new CMD and EXPOSE instructions

  1. docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a svendowideit/testimage:version4


然后可以docker push提交

inspect

  1. docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

attach

  1. docker attach xxx

docker attach 不是一个用来进入容器的命令, 或者说他不是用来在容器内运行一个 bash(shell) 的命令,
它是用来连接到容器中运行中的进程, 也就是容器的 CMD, 容器内 PID=1 的那个进程,
如果这个进程没有 stdout/stderr 那么你将看不到任何输出, 如果它没有接收 stdin 你也无法发送指令给它.

使用 CTRL-P CTRL-Q 来退出容器,
如果使用 CTRL+C 那么会导致容器结束(Exited), 因为它会发送 SIGKILL 给容器的进程, 然后这个容器就 Exited 了,
当然这里可以使用 docker attach --sig-proxy=false 防止发送 SIGKILL 给进程
https://www.lsproc.com/post/docker-faq

exec

  1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

· 基本模式 – 在命令行中同步运行容器中的命令
· 后台模式 – 后台执行容器中的命令
· 交互模式 – 执行一个命令,允许用户与之交互

栗如

  1. docker exec -d CONTAINER find / -ctime 7 -name '*log' -exec rm {} \;
  2. docker exec -i -t CONTAINER /bin/bash

CONTAINER 可以是id或者name

网络

https://docs.docker.com/network/

主机与docker容器网络通讯的方式有为3种:

  • 桥接(Bridge):

也是最常用的方式,该模式下会将主机上的端口映射到docker容器的端口上,
例如8080:8081则会将主机上的8080端口映射到docker容器的8081端口
使用-p参数或者-P参数,-p 主机端口:容器端口,-P则使用随机的主机端口映射到docker容器

  • 共享(Host):

主机与docker共享同一端口

  • 无网络(None):

docker没有网络,外界无法访问

容器内其他操作

安装ps命令

  1. apt-get install procps

应用

一个栗子: 使用docker配置开发环境
http://numbbbbb.com/2016/09/26/20160926_%E7%94%A8%20Docker%20%E5%BF%AB%E9%80%9F%E9%85%8D%E7%BD%AE%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/

最佳实践

优化Docker镜像,加速应用部署,教你6个小窍门
https://mp.weixin.qq.com/s?__biz=MzU4MzA0MTc3Nw==&mid=2247483910&idx=1&sn=48c72758b012d928c13b01e77a772abf
明确指定包含版本或者其他辅助信息的tag

使用alpine版本的基础镜像,来减小镜像体积,以保证部署和扩容速度。
证Dockerfile中的清理命令在同一行,也可以减小镜像体积。

利用分层机制,可以减小镜像传输大小,加快镜像的推送和拉取速度

避免使用进程管理程序,保证应用健康运行

2种方法帮助Java应用运行调优:
使用新版本JavaSE 8 ( ≥ 8u131)
直接指定heap相关的参数

2点要求保证数据和日志持久化存储:
避免使用本地存储
应用日志不能写到本地文件


最佳实践
https://blog.qikqiak.com/post/dockerfile-best-practice/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io