针对Docker容器进入的4种方式和docker容器进入的4种方式这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展167dockerdocker构建nginx容器系列问题dockerregi
针对Docker 容器进入的 4 种方式和docker容器进入的4种方式这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、Docker none镜像移除, 容器进入, 退出、Docker 入门私人笔记(二)三种进入 Docker 容器的方法、Docker 容器互访三种方式等相关知识,希望可以帮助到你。
本文目录一览:- Docker 容器进入的 4 种方式(docker容器进入的4种方式)
- 167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
- Docker none镜像移除, 容器进入, 退出
- Docker 入门私人笔记(二)三种进入 Docker 容器的方法
- Docker 容器互访三种方式
Docker 容器进入的 4 种方式(docker容器进入的4种方式)
在使用 Docker 创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入 Docker 容器有好几多种方式,这里我们就讲一下常用的几种进入 Docker 容器的方法。
进入 Docker 容器比较常见的几种做法如下:
-
使用 docker attach
-
使用 SSH
-
使用 nsenter
-
使用 exec
一、使用 docker attach 进入 Docker 容器
Docker 提供了 attach 命令来进入 Docker 容器。
接下来我们创建一个守护态的 Docker 容器,然后使用 docker attach 命令进入该容器。
-
$ sudo docker run -itd ubuntu:14.04 /bin/bash
然后我们使用 docker ps 查看到该容器信息,接下来就使用 docker attach 进入该容器
-
$ sudo docker attach 44fc0f0582d9
可以看到我们已经进入到该容器中了。
但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
因为这个原因,所以 docker attach 命令不太适合于生产环境,平时自己开发应用时可以使用该命令。
167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo
background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑
1.nginx服务器根目录问题
docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同
eg:
run一个niginx容器
<span>//80端口被占用,so...</span> $ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES <span>1801</span>a32aab54 nginx <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago Up <span>2</span> minutes <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-></span><span>800</span>/tcp berserk_kare
进入容器内部
<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash root<span>@1801a32aab54</span><span>:/</span><span># </span>
查看nginx目录
<span># cd /etc/nginx/</span> conf<span>.d</span>/ koi-utf mime<span>.types</span> nginx<span>.conf</span> uwsgi_params fastcgi_params koi-win modules/ scgi_params win-utf
可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled
继续查看nginx配置
<span># cat /conf.d/default.conf</span><span>server</span> { listen <span>80</span>; server_name localhost; <span>#charset koi8-r;</span><span>#access_log /var/log/nginx/log/host.access.log main;</span> location / { root /usr/share/nginx/html; <span>index</span><span>index</span>.html <span>index</span>.htm; } <span>#error_page 404 /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span> error_page <span>500</span><span>502</span><span>503</span><span>504</span> /<span>50</span>x.html; location = /<span>50</span>x.html { root /usr/share/nginx/html; } <span>#...省略php-fpm配置,好长..</span> }
根目录配置: root /usr/share/nginx/html;
测试
<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" >index.html</span>
php-fpm配置相关
'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
Docker none镜像移除, 容器进入, 退出
$ docker stop $(docker ps -a | grep "Exited" | awk ''{print $1 }'') //停止容器 $ docker rm $(docker ps -a | grep "Exited" | awk ''{print $1 }'') //删除容器 $ docker rmi $(docker images | grep "none" | awk ''{print $3}'') //删除镜像
移除 images 所有 <none>镜像,
docker ps -a | grep "Exited" | awk ''{print $1 }'' | xargs docker stop
进入容器
docker attach 容器ID
若Ctrl +C 容器会关闭
退出容器
Ctrl+P+Q进行退出容器
Docker 入门私人笔记(二)三种进入 Docker 容器的方法
1. 使用 attach 命令连接容器
docker attach [容器名] 或者 [容器ID]
attach 命令有如下缺点:
1.1 当你从多个终端同时使用 attach 命令连接到同一个容器后,多个终端显示的操作是同步的。也就是说你从A终端操作什么命令,在B终端也显示一样的命令和结果。同理,你在某个终端针对该容器的某个操作阻塞了或者异常了,那么其他的终端也同样不可操作了。
1.2 在 attach 的连接方式下使用 exit 退出容器后,该容器也会终止运行。
2. 使用 nsenter 命令连接容器
使用该命令连接容器,用 exit 命令退出容器后,容器不会终止运行。
2.1 nsenter 命令包含在 util-linux 里面,所以使用之前要先安装。
yum install -y util-linux
2.2 使用 nsenter 命令连接容器,需要获取容器的 PID。
可以使用 inspect 命令获取容器的详情:
docker inspect [容器名]或者[容器ID]
获取 docker 的第一个进程的 PID:
docker inspect --format "{{.State.Pid}}" mycentos
通过该 PID 连接容器:
nsenter --target [容器第一个进程的PID] --mount --uts --ipc --net --pid
写一个连接容器的脚本,命名为 docker_login.sh,脚本内容如下:
#!/bin/bash
#此脚本用来登录任意容器。使用方法:./docker_login [容器名]或者[容器ID]
docker_in(){
NAME_ID=$1
PID=$(docker inspect --format "{{.State.Pid}}" $NAME_ID)
#nsenter --target $PID --mount --uts --ipc --net --pid
nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash
#nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash 2>/dev/null
#nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash >/dev/null 2>&1
#nsenter --target $PID --mount --uts --ipc --net --pid /bin/bash >/dev/null 2>&1 &
if (test $? -ne 0)
then
nsenter --target $PID --mount --uts --ipc --net --pid /bin/sh
fi
}
docker_in $1
3. 使用 exec 命令连接容器
docker exec -it [容器名] /bin/bash
使用该命令连接容器,exit 退出后容器仍然继续运行。
说明:
为什么使用 exec 和 nsenter 命令连接容器再退出就不会导致容器终止,而使用 attach 连接容器再退出,容器就终止运行了呢?
因为前两个命令都是另外启动一个新的 bash 来连接容器,当退出容器时,终止的只是它们建立的 bash,而容器原来的 bash 进程还在。相应的,attach 使用的是容器启动后的 bash,所以退出该 bash ,容器也就终止了。
总结:
脚本的方式适合单节点上的容器维护,缺点是每台主机上都放个脚本,增加维护成本。最简单最常用的方式其实是 exec ,一个命令,语法也很简单。三种 docker 的连接方式,选择哪个还是要看使用场景。
Docker 容器互访三种方式
我们都知道 docker 容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢。下面介绍三种方法解决容器互访问题。
方式一、虚拟 ip 访问
安装 docker 时,docker 会默认创建一个内部的桥接网络 docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据 ip 互相访问。

[root@33fcf82ab4dd /]# [root@CentOS ~]# ifconfig
......
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:35ff:feac:66d8 prefixlen 64 scopeid 0x20<link>
ether 02:42:35:ac:66:d8 txqueuelen 0 (Ethernet)
RX packets 4018 bytes 266467 (260.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4226 bytes 33935667 (32.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
......

运行一个 centos 镜像, 查看 ip 地址得到:172.17.0.7

[root@CentOS ~]# docker run -it --name centos-1 docker.io/centos:latest
[root@6d214ff8d70a /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.7 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:7 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:07 txqueuelen 0 (Ethernet)
RX packets 16 bytes 1296 (1.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

以同样的命令再起一个容器,查看 ip 地址得到:172.17.0.8

[root@CentOS ~]# docker run -it --name centos-2 docker.io/centos:latest
[root@33fcf82ab4dd /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.8 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:8 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:08 txqueuelen 0 (Ethernet)
RX packets 8 bytes 648 (648.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

容器内部 ping 测试结果如下:

[root@33fcf82ab4dd /]# ping 172.17.0.7
PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.205 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.119 ms
64 bytes from 172.17.0.7: icmp_seq=3 ttl=64 time=0.118 ms
64 bytes from 172.17.0.7: icmp_seq=4 ttl=64 time=0.101 ms

这种方式必须知道每个容器的 ip,在实际使用中并不实用。
方式二、link
运行容器的时候加上参数 link
运行第一个容器
docker run -it --name centos-1 docker.io/centos:latest
运行第二个容器
[root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest
--link:参数中第一个 centos-1 是容器名,第二个 centos-1 是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。
测试结果如下:

[root@e0841aa13c5b /]# ping centos-1
PING centos-1 (172.17.0.7) 56(84) bytes of data.
64 bytes from centos-1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=4 ttl=64 time=0.114 ms

此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。
方式三、创建 bridge 网络
1. 安装好 docker 后,运行如下命令创建 bridge 网络:docker network create testnet
查询到新创建的 bridge testnet。
2. 运行容器连接到 testnet 网络。
使用方法:docker run -it --name <容器名> ---network <bridge> --network-alias < 网络别名 > < 镜像名 >
[root@CentOS ~]# docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
[root@CentOS ~]# docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest
3. 从一个容器 ping 另外一个容器,测试结果如下:

[root@fafe2622f2af /]# ping centos-1
PING centos-1 (172.20.0.2) 56(84) bytes of data.
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=4 ttl=64 time=0.113 ms

4. 若访问容器中服务,可以使用这用方式访问 <网络别名>:< 服务端口号 >
推荐使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑 ip 是否变动,只要连接到 docker 内部 bright 网络即可互访。bridge 也可以建立多个,隔离在不同的网段。
关于Docker 容器进入的 4 种方式和docker容器进入的4种方式的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、Docker none镜像移除, 容器进入, 退出、Docker 入门私人笔记(二)三种进入 Docker 容器的方法、Docker 容器互访三种方式的相关知识,请在本站寻找。
本文标签: