资源
简介 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/
基本概念
安装
https://docs.docker.com/install/
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)
基本用法
docker --help
docker [command] –help
service docker start # 启动服务
docker images # 查看本机上的所有镜像
docker run [imageName] # 会自动拉取 image, 相当于 docker create 加 docker start
docker image rm ${image_id} # 删除某个镜像
docker ps # 查看运行中的 container
docker ps -a #包括终止运行的容器
# 启动某个 container
docker start ${container_id}
# 停止某个 container
docker stop ${container_id}
# 重启某个 container
docker restart ${container_id}
# 删除某个 container
docker rm ${container_id}
image和container常用操作
将 image 文件从仓库抓取到本地
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略
docker image pull library/hello-world
docker image pull hello-world
docker image ls
docker image rm [imageName]
从dockerfile创建image
docker image build -t koa-demo .
docker image build -t koa-demo:0.0.1 .
docker container run命令具有自动抓取 image 文件的功能。
如果发现本地没有指定的 image 文件,就会从仓库自动抓取。
因此,前面的docker image pull命令并不是必需的步骤
docker container run [imageName]
docker container run -p 8000:3000 -it koa-demo /bin/bash
-it参数:容器的 Shell 映射到当前的 Shell
—rm container结束后自动rm (两个-, 不加这个选项的话默认不会rm)
最后那里是容器启动后第一个执行的命令, “/bin/bash”保证shell被启动
也可以写成Dockerfile里面的CMD
启动已有的container
docker container start [containerID]
docker container ls
docker ps # 等价
docker container ls --all #包括终止运行的容器
docker ps -a # 等价
https://docs.docker.com/engine/reference/commandline/ps/
docker container kill [containID] # SIGKILL
docker container stop [containID] # SIGTERM SIGKILL
docker container rm [containerID]
如果run的时候没加-it, 则以下命令可以打印container的标准输出, 以及执行命令
docker container logs [containerID]
docker container exec -it [containerID] /bin/bash
从container复制文件
docker container cp [containID]:[/path/to/file] .
其他命令
docker container --help
发布image文件
去 hub.docker.com 或 cloud.docker.com 注册一个账户
docker login
接着,为本地的 image 标注用户名和版本。
docker image tag [imageName] -t [username]/[repository]:[tag]
docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。
docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。
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
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Commit a container with new configurations
docker commit --change "ENV DEBUG true" c3f279d17e0a svendowideit/testimage:version3
Commit a container with new CMD and EXPOSE instructions
docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a svendowideit/testimage:version4
inspect
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
attach
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
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
· 基本模式 – 在命令行中同步运行容器中的命令
· 后台模式 – 后台执行容器中的命令
· 交互模式 – 执行一个命令,允许用户与之交互
栗如
docker exec -d CONTAINER find / -ctime 7 -name '*log' -exec rm {} \;
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):
容器内其他操作
安装ps命令
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