前言
作为一个苦逼Windows用户, Docker和Virtualbox只能二选一. 所以之前就一直没怎么用过Docker. 但最近因工作需要不得不用docker, 只好恶补一下, 顺便做个笔记, 把自己学习过程中的一些理解记录下来
常用命令
下载镜像
docker pull <image_name>
列出镜像
docker images
docker image ls
删除镜像
docker rmi <image_name/image_id>
运行容器
docker run -it <image_name/image_id> <params>
-i ,interactive, 交互式操作
-t ,terminal 创建一个伪终端
-i 和 -t一般连用, 不用-i的话不能进行交互(比如用不了vi这些交互式命令)
-d ,daemon 后台运行
--rm, 停止后自动删除容器, 不需要再去docker ps -a&&docker rm了
-v <path>:<path>, volume 共享文件夹
-p <host_port>:<container_port>, port 映射端口
-P, Ports 映射全部端口
--privileged, 用特权方式运行容器. 可以简单理解为Windows下的以管理员权限运行, linux下的sudo, 一般涉及到宿主机硬件或者系统文件的时候才需要用到
--net "bridge", 指定容器的网络连接类型
bridge, 创建独立的网络栈,保证容器内的进程组使用独立的网络环境,实现容器间、容器与宿主机之间的网络栈隔离。另外,Docker通过宿主机上的网桥(docker0)来连通容器内部的网络栈与宿主机的网络栈,实现容器与宿主机乃至外界的网络通信
host, 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
none, 容器创建后没有网卡、IP、路由等信息。需要手动添加网卡、配置IP
container, 指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享
--name "container_name", 自定义一个容器名称, 方便后面使用
-h "<hostname>", host 指定容器的hostname
--dns <dns_server>, 指定容器的dns服务器
列出容器
列出当前运行的容器
docker ps
列出所有创建的容器(包含已关闭但未删除的容器)
docker ps -a
关闭容器
docker stop <container_id/container_name>
删除容器
docker rm <container_id/container_name>
重启容器
docker restart <container_id/container_name>
进入后台容器
docker attach <container_id/container_name>
在容器内执行
docker exec -it <container_id/container_name> <command>
如要在名称为lzskyline的容器中开启一个bash, 可使用:
docker exec -it lzskyline bash
退出exec启动的程序不会影响容器的停止
构建镜像
根据dockerfile创建镜像文件
docker build -t <image_name> <image_path>
常用快捷键
容器内关闭退出: Ctrl + D
容器内关闭不退出: Ctrl+P+Q
dockerfile部分
- 如果别人的镜像用的不爽但是又没有对方的dockerfile文件时可以用FROM的方式继承镜像内容, 再使用RUN执行命令二次修改
常见问题
- docker容器运行后自动退出, 加了-itd不起作用
原因:
image的ENTRYPOINT可能设置为了一个非挂起的程序, 比如在dockerfile里面指定了ENTRYPOINT ["ls"]. 这样就是会自动退出的
解决方案:
有dockerfile的话就修改一下, 改为ENTRYPOINT ["bash"]之类的即可.
没有dockerfile的话可以用FROM的方式继承源镜像, 再在下面加上ENTRYPOINT ["bash"], 可以覆盖掉原来的ENTRYPOINT.
dockerfile改好之后
PS
现在还有很多docker的功能没有使用到, 后续摸索完之后会继续补充, 目前计划的有
- dockerfile的相关语法
- 更新镜像(类似保存快照)
内容若有错误之处还请留言斧正 ^_^
2 条评论
这是用什么程序写得博客,还不错
Typecho, 支持Markdown的轻量博客系统
Cactus, Typecho主题模板