Docker容器
1、创建容器
#创建容器的格式:docker run [option] image [cmd]
#docker run 运行流程
1、检查本地是否有指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
3、返回容器ID
[root@web01 ~]# docker run -d nginx
1.1容器启动参数
参数 |
释义 |
-d |
以守护进程方式运行 |
-p |
指定映射端口 |
-P |
随机映射端口 |
-i |
保持标准输入打开 |
-t |
分配一个伪终端 |
-v |
设置挂载文件到主机上 |
--rm |
当容器关闭时自动删除 |
--name |
为启动的容器设置一个名字 |
--network |
指定使用哪个网络 |
参数 |
释义 |
-e |
设置容器中的环境变量 |
--link |
链接到另一个容器 |
-h |
指定容器内的主机名 |
–privileged=true |
容器的特权模式 |
1.2参数详解
# -d 以守护进程的方式启动
[root@web01 ~]# docker run -d nginx
# -p 指定端口映射
[root@web01 ~]# docker run -d -p 8080:80 nginx
fb5abb9bf42cc92a9ee2849f6044dd6dff757acd27fe5ce5744dde9f96f1c610
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb5abb9bf42c nginx "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp sweet_jackson
# -P 随机端口映射
[root@web01 ~]# docker run -d -P nginx
3cf2ff5b1e26dcf0aca8bb3adc2b9c92c841f96a601570c6b17dcb9f989ffdca
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cf2ff5b1e26 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:49153->80/tcp hardcore_dhawan
# -i 打开标准输出(一般与-t同时使用) 可以进行交互
# -t 创建一个伪终端 打开一个终端页面
[root@web01 ~]# docker run -it centos
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
[root@3095cbb5c255 /]#
# -v 挂载目录到容器中
PS:docker run -v 宿主机目录:容器内目录
[root@web01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 2 months ago 133MB
centos latest 300e315adb2f 3 months ago 209MB
centos 7 8652b9f0cb4c 4 months ago 204MB
[root@web01 ~]# docker run -it -v /opt:/root centos:7 bash
bash-4.2# ls /root
containerd nginx.tar test1.tar test2.tar
# --rm 容器关闭时自动删除
[root@web01 ~]# docker run -d --rm nginx
ede2d2cf56aa244007407f226be4c13dd4638f52ab9d8b0d71dd44a04f4a97a2
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ede2d2cf56aa nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 80/tcp clever_nobel
[root@web01 ~]# docker stop ede2d2cf56aa
ede2d2cf56aa
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# --name 为容器指定名称
PS:为容器指定名字后,docker会自动将该名字加入dns解析
[root@web01 ~]# docker run -d --name nginx nginx
e59356f798eae2f0c96aa1051c6d25030931d89f9ece595980d87d4e6c21f917
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e59356f798ea nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 80/tcp nginx
# --network 指定使用哪个网络
#此处指定容器使用ddff网桥
[root@web01 ~]# docker run -d --net=ddff nginx
# -e 在容器中设置环境变量
[root@web01 ~]# docker run -it -e NGINX=nginxnginxnginx centos:7 bash
[root@9c4a31873315 /]# env
HOSTNAME=9c4a31873315
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
NGINX=nginxnginxnginx
SHLVL=1
HOME=/root
_=/usr/bin/env
# --link 连接上一个容器,实现网络互通
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e59356f798ea nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp nginx
[root@web01 ~]# docker run -it --link nginx centos:7 bash
[root@24d4fcfbc144 /]# curl nginx
<!DOCTYPE html>
<html>
你好,这是容器e59356f798ea的nginx页面
</html>
# -h 设置容器主机名
[root@web01 ~]# docker run -it -h ddff centos:7 bash
[root@ddff /]# hostname
ddff
# –privileged=true
大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
甚至允许你在docker容器中启动docker容器。
2、查看本地的容器列表
#格式
docker ps [参数]
#参数
-a 查看所有的容器(包括停止的)
-q 仅显示容器的ID
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac71522935a1 nginx "/docker-entrypoint.…" 37 seconds ago Up 36 seconds 80/tcp nginx
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79e245d3fbf8 nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 3 minutes ago nginx_test
ac71522935a1 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp nginx
[root@web01 ~]# docker ps -q
ac71522935a1
[root@web01 ~]# docker ps -aq
79e245d3fbf8
ac71522935a1
3、停止和启动一个容器
#停止
docker stop [容器名称|容器ID]
#启动
docker start [容器名称|容器ID]
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac71522935a1 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 80/tcp nginx
[root@web01 ~]# docker stop nginx
nginx
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac71522935a1 nginx "/docker-entrypoint.…" 7 minutes ago Exited (0) 10 seconds ago nginx
[root@web01 ~]# docker start nginx
nginx
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac71522935a1 nginx "/docker-entrypoint.…" 7 minutes ago Up 3 seconds 80/tcp nginx
4、删除容器
#格式
docker rm [容器名称|容器ID]
#参数
-f 强制删除
docker rm -f [容器名称|容器ID]
#清空容器小连招
docker rm -f $(docker ps -a -q)
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac71522935a1 nginx "/docker-entrypoint.…" 14 minutes ago Up 6 minutes 80/tcp nginx
[root@web01 ~]# docker rm -f nginx
nginx
[root@web01 ~]# docker ps
5、查看容器内容
#格式
docker inspect [容器名称|容器ID]
#如何合理的监控docker的运行状态
docker inspect -f '{{.State.Running}}' [容器名称|容器ID]
[root@web01 ~]# docker inspect nginx
[
{
"Id": "sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74",
"RepoTags": [
"nginx:latest"
],
......
[root@web01 ~]# docker inspect -f '{{.State.Running}}' nginx_test
true
6、复制文件
#格式
dockers cp 源路径 目标路径
1、将宿主机的文件复制到容器内
[root@web01 ~]# docker cp /opt/test.txt 1f82305cbabf:/root
[root@1f82305cbabf /]# cd /root
[root@1f82305cbabf ~]# ls
anaconda-ks.cfg test.txt
2、将容器内的文件复制到容器外
[root@web01 ~]# docker cp 1f82305cbabf:/root/test222.txt /opt
[root@web01 ~]# ll /opt
-rw-r--r-- 1 root root 0 Mar 19 19:47 test222.txt
7、进入容器
进入容器一般有四种方式
7.1 exec
#exec
#在容器外面向容器内执行一个命令(官方推荐)
#在容器中新建一个bash进程
# docker exec [参数] [容器名称|容器ID] [cmd]
[root@web01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84880f80100a centos:7 "/bin/bash" 2 minutes ago Up 2 minutes optimistic_brahmagupta
[root@web01 ~]# docker exec -it 84880f80100a bash
[root@84880f80100a /]#
7.2 attach
#attach
#在早期docker提供的进入容器的命令(缺点:当其结束时,容器也跟着结束了)
#直接接管容器的主bash进程
# docker attach [容器ID|容器名称]
7.3 nsenter
#nsenter
#建立一个管道连接上容器主ID
# nsenter --target $( docker inspect -f {{.State.Pid}} 30d369d70bcd) --mount --uts --ipc --net --pid
7.4 ssh
#通过ssh连接到容器