创建新容器
docker run --name con_1 -it centos:latest /bin/bash
此操作会使用centos:latest镜像创建一个新容器,命名为con_1,并进入交互模式。如果镜像centos:latest不存在,则自动下载。
注:虽然docker会为每个新容器自动创建一个随机的容器ID,但为了方便管理,建议养成手动命名的习惯。
参数说明:
- –name: 容器名;不指定该参数时,docker会随机指派名字。
- -i:让容器的标准输入保持打开。
- -t:让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。
- centos:latest:镜像名为centos,标签(tag)为lastest。
- /bin/bash:启动的软件路径/命令。这里启动了一个bash终端。
如果让容器在创建后在后台运行,使用-d
参数。注: 容器最终是否会长久运行,与运行的软件有关。
如果让容器在运行结束后不保存,使用--rm
参数。
时区设置
docker镜像一般使用UTC 时间,默认时区为零时区,因此与北京时间有8小时的时差。当宿主机为 Linux 系统时,我们可以直接将宿主机上的/etc/timezone和/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一致。
-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro
例如:docker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --rm -it ubuntu /bin/bash
在X86架构的电脑上运行ARM容器
docker使用qemu来模拟ARM架构,因此先安装qemu:
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
查看容器
docker ps
查看包含已停止的容器:docker ps -a
重命名容器
docker rename 容器ID/name 新name
停止容器
- 在交互模式下,直接执行
exit
;或者按下Ctrl+d键。 - 使用
docker stop 容器ID/name
来终止一个运行中的容器。
终止状态的容器可以用 docker ps -a
命令看到。例如:
启动已停止的容器
docker start 容器ID/name
这时容器启动,并在后台运行。
如果进行交互,可以执行docker attach 容器ID/name
或docker exec -it 容器ID/name /bin/bash
。两者区别为,attach
命令会将你的终端附加到容器的主进程上,但不启动新的shell会话;exec
命令在容器内启动一个新的shell会话。
删除容器
docker rm 容器ID/name
如果要删除正在运行中的容器,可增加-f
参数,如:docker rm -f con_1
。
导出容器
docker export 容器ID/name > 文件路径
例如:docker export con_2 > ~/dockerdata/con_2.tar
这将会把指定容器和其附属的镜像一起导出为一个镜像文件。
导入容器
由于导出的是镜像,因此所谓导入容器,其实导入是包含容器内容的镜像。
docker import 文件路径 镜像名
例如:docker import con_2.tar mengmei/centos:v1
执行docker image ls
,可以看到这个新镜像mengmei/centos:v1。
接下来我们就可以通过docker run --name con_2_bak -it mengmei/centos:v1 /bin/bash
来启动这个导入的容器了。
端口映射
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
在新建容器时,通过-p
参数来指定本机端口与容器端口的映射。
例如:docker run --name nginx_1 -p 11080:80/tcp -p 11081:81/udp -d nginx:latest
将本机的11080tcp端口与容器的80tcp端口绑定,本机11081upd端口与容器的81upd端口绑定。
如果在新建容器结束后想修改端口映射,可采用下面几种方法:
方法一、修改容器配置文件,重启docker服务
编辑容器的配置文件:/var/lib/docker/containers/容器id/hostconfig.json
找到要修改的端口,例如:
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"11080"}]}
改为:
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"11085"}]}
最后重启docker服务,即可将本机映射的11080端口改为11085端口。
这个方法的优点是操作简单,缺点是需要重启整个docker服务,会影响其他正在运行的容器。
方法二、iptable转发端口
先获取容器的IP,执行 docker inspect 容器ID/name | grep IPAddress
。
假如得到容器的IP为172.17.0.2,继续执行 iptables -t nat -A DOCKER -p tcp --dport 11086 -j DNAT --to-destination 172.17.0.2:80
。
即可将本机11080tcp端口与容器的80tcp端口绑定。
方法三、利用docker commit新构镜像
docker commit
:把一个容器的文件改动和配置信息保存到一个新的镜像,其实就是导出容器。
- 1、停止docker容器
docker stop 容器ID/name
- 2、生成新镜像
docker commit 容器ID/name new_image:tag
- 3、用前一步新生成的镜像重新启动一个容器
文件映射
主机上的 A 目录映射到容器 B
要让主机上的某个目录(设为A)能够在Docker容器B中被访问,我们可以在运行容器时使用 -v 或 –mount 标志。以 -v 参数为例,指令如下:
docker run -v /path/to/host/A:/path/in/container/B image_name
其中,/path/to/host/A 是主机上的路径,/path/in/container/B 是容器内的路径。这个命令会在容器B中创建一个名为B的目录,该目录映射到主机上的目录A。容器B内部对目录B的任何改变都会在主机的目录A中反映出来。
容器里面的C目录映射到主机D
对于容器内的目录C映射到主机的目录D,我们可以使用Docker的volume参数进行操作。首先创建一个新的volume:
docker volume create --driver local --opt o=bind --opt type=none --opt device=/path/to/host/D volumeC
然后,在运行容器时将容器中的目录C与此volume进行挂载:
docker run -v volumeC:/path/in/container/C image_name
设置容器自启动
创建容器时设置:
docker run -d --restart=always 容器ID/name
# Docker 容器的重启策略如下:
–restart具体参数值详细信息:
no // 默认策略,容器退出时不重启容器;
on-failure // 在容器非正常退出时(退出状态非0)才重新启动容器;
on-failure:3 // 在容器非正常退出时重启容器,最多重启3次;
always // 无论退出状态是如何,都重启容器;
unless-stopped // 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。
修改已有容器:
docker update --restart=always 容器ID/name