GVKun编程网logo

Docker 容器进入的 4 种方式(docker容器进入的4种方式)

5

针对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种方式)

Docker 容器进入的 4 种方式(docker容器进入的4种方式)

在使用 Docker 创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入 Docker 容器有好几多种方式,这里我们就讲一下常用的几种进入 Docker 容器的方法。

进入 Docker 容器比较常见的几种做法如下:

  • 使用 docker attach

  • 使用 SSH

  • 使用 nsenter

  • 使用 exec

一、使用 docker attach 进入 Docker 容器

  Docker 提供了 attach 命令来进入 Docker 容器。

 

  接下来我们创建一个守护态的 Docker 容器,然后使用 docker attach 命令进入该容器。

  1. $ sudo docker run -itd ubuntu:14.04 /bin/bash  

 

  然后我们使用 docker ps 查看到该容器信息,接下来就使用 docker attach 进入该容器

  1. $ sudo docker attach 44fc0f0582d9  


  可以看到我们已经进入到该容器中了。

 

  但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。

 

因为这个原因,所以 docker attach 命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

docker构建nginx容器系列问题


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>-&gt;</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" &gt;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 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 ps -a | grep "Exited" | awk ''{print $1 }'' xargs docker rm
 
  docker images grep none awk ''{print $3 }'' xargs docker rmi
  若存在容器未关闭,先执行上面停止容器, 并删除容器, 再执行该行
  

 

 

进入容器

docker attach 容器ID

若Ctrl +C 容器会关闭

 

退出容器

Ctrl+P+Q进行退出容器

 

 

Docker 入门私人笔记(二)三种进入 Docker 容器的方法

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 容器互访三种方式

  我们都知道 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 容器互访三种方式的相关知识,请在本站寻找。

本文标签: