一、外部访问容器
1、docker run -P 用法

点击(此处)折叠或打开

  1. # docker pull nginx
  2. # docker images
  3. nginx latest c59f17fe53b0 2 weeks ago 108MB
  4. # docker run -itd -P --name nginx nginx
  5. -P 对外映射一个随机端口
  6. #查看本地ip端口范围
  7. # cat /proc/sys/net/ipv4/ip_local_port_range
  8. 3276860999
  9. # docker ps
  10. 547cfd66e68c nginx "nginx -g 'daemon ..." 21 seconds ago Up 20 seconds 0.0.0.0:32773->80/tcp nginx
  11. #查看nginx日志信息
  12. docker logs -f nginx
  13. # netstat -nlp |grep 32773
  14. tcp6 0 0 :::32773 :::* LISTEN 5810/docker-proxy
  15. # curl http://localhost:32773
  16. <!DOCTYPE html>
  17. <html>
  18. <head>
  19. <title>Welcome to nginx!>
  20. <style>
  21.     body {
  22.         width: 35em;
  23.         margin: 0 auto;
  24.         font-family: Tahoma, Verdana, Arial, sans-serif;
  25.     }
  26. </style>
  27. </head>
  28. <body>
  29. <h1>Welcome to nginx!>
  30. <p>If you see this page, the nginx web server is successfully installed and
  31. working. Further configuration is required.</p>

  32. <p>For online documentation and support please refer to
  33. <a href="http://nginx.org/">nginx.org</a>.<br/>
  34. Commercial support is available at
  35. <a href="http://nginx.com/">nginx.com</a>.</p>

  36. <p><em>Thank you for using nginx.</em></p>
  37. </body>
  38. </html>

Docker学习之网络篇-LMLPHP

2、docker run -p用法
    映射所有接口地址:hostport:containerport

点击(此处)折叠或打开

  1. #本地的8080端口映射到容器的5000端口
  2. # docker run -d -p 8080:5000 training/webapp python app.py
  3. f20bce4b0263352b0887b3626bf5617a24f395b13330462c43af985ef3b1e445
  4. # docker ps
  5. f20bce4b0263 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:8080->5000/tcp stoic_perlman
  6. # curl http://192.168.3.59:8080
  7. Hello  world!
  8. # docker logs -f f20bce4b0263
  9. * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  10. 192.168.3.59 - - [14/Nov/2017 08:49:03] "GET / HTTP/1.1" 200 -
  11. 192.168.113.5 - - [14/Nov/2017 08:49:38] "GET / HTTP/1.1" 200 -
    映射到指定地址的指定端口:ip:hostport:containerport

点击(此处)折叠或打开

  1. #映射使用一个特定地址,这里用127.0.0.1为例
  2. # docker run -d -p 127.0.0.1:8081:5000 training/webapp python app.py
  3. b8c4c38f63d521489eb05c03ef476619bb09048a63770f033ba1232a9fc96730
  4. # docker ps
  5. b8c4c38f63d5 training/webapp "python app.py" 2 seconds ago Up 1 second 127.0.0.1:8081->5000/tcp elated_jang
  6. # curl http://127.0.0.1:8081
  7. Hello  world!
  8. # docker logs -f b8c4c38f63d5
    映射到指定地址的任意端口:ip::containerport

点击(此处)折叠或打开

  1. #绑定ip任意的端口映射到容器端口,本地主机会自动分配一个端口
  2. # docker run -d -p 127.0.0.1::5000 training/webapp python app.py
  3. 7b220d0d49488a7ed99cbf43798ff355e99aa9ae3b469c42fdf8d6e71c735f75
  4. # docker ps
  5. 7b220d0d4948        training/webapp     "python app.py"          4 seconds ago       Up 3 seconds        127.0.0.1:32768->5000/tcp   agitated_jackson
  6. # curl http://127.0.0.1:32768
  7. Hello world!
  8. #使用udp标记来指定udp端口
  9. docker run --p 8080:5000/udp training/webapp python app.py
  10. #查看影射端口配置
  11. # docker port f20bce4b0263
  12. 5000/tcp -> 0.0.0.0:8080
  13. # docker port f20bce4b0263 5000
  14. 0.0.0.0:8080

    
    -p也可以使用多次来绑定多个端口
    

点击(此处)折叠或打开

  1. # docker run -d -p 8000:5000 -p 8001:5000 --name web training/webapp python app.py
  2. # docker ps
  3. f452e2d55579 training/webapp "python app.py" 4 seconds ago Up 3 seconds 0.0.0.0:8000->5000/tcp, 0.0.0.0:8001->5000/tcp brave_bor
  4. # 查看容易的名字
  5. docker inspect -f "{{ .Name }}" f452e2d55579
  6. /web
  7. # netstat -nlp
  8. tcp6       0      0 :::8000                 :::*                    LISTEN      8276/docker-proxy
  9. tcp6       0      0 :::8001                 :::*                    LISTEN      8266/docker-proxy
  10. # curl http://192.168.3.59:8000
  11. Hello  world!
  12. # curl http://192.168.3.59:8001
  13. Hello world!

二、数据卷
数据卷是一个可供一个或多个容器使用的特殊目录。

点击(此处)折叠或打开

  1. #创建宿主机数据卷/tmp/test并挂载到容器中/opt/test下;
  2. #默认情况如果只声明数据卷而没有映射到宿主机上的具体目录,Docker会在/var/lib/docker/volumes下分配一个具有唯一名字的目录给该数据卷。
  3. # docker run -d -P -v /tmp/test:/opt/test training/webapp python app.py
  4. # docker inspect --format '{{.Mounts}}' ba
  5. [{bind  /tmp/test /opt/test   true }]
  6. #通过本地挂载目录到容器的数据卷,宿主机对目录内的改变会同步反映到容器中,反之也一样。
  7. # docker run --rm -it -v /tmp/test:/opt/test ubuntu:latest /bin/bash
  8. # root@fc84ee9838fe:/# cd /opt/test/
  9. root@fc84ee9838fe:/opt/test# touch test.txt
  10. # root@ubuntu:/home/ubuntu# ll /tmp/test/
  11. -rw-r--r--  1 root root    0 11月 21 18:38 test.txt
  12. #数据卷容器是指一个专门用于挂载数据卷的容器,以供其它容器引用和使用。
  13. # docker run -d -v /dbdata --name dbdata training/postgres
  14. 055f7ceebee4cc35027e4e9967c80313817d7b994de615439bd6f6fce0e79321
  15. # docker run -d --volumes-from=dbdata --name db1 training/postgres
  16. b2f4ca6f7cdbf321e06680b86942617f5604bb8aecead8260aec05cb2fe1484c
  17. #以下可以看出dbdata和db1使用同一个数据卷/dbdata
  18. # docker inspect --format '{{ .Mounts }}' dbdata
  19. [{volume 74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39 /var/lib/docker/volumes/74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39/_data /dbdata local  true }]
  20. # docker inspect --format '{{ .Mounts }}' db1
  21. [{ 74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39 /var/lib/docker/volumes/74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39/_data /dbdata local  true }]
  22. # ll /var/lib/docker/volumes/74*
  23. drwxr-xr-x  2 root root 4096 11月 21 18:44 _data/
  24. #容器的停止和删除都不会导致数据卷本身删除,如需删除数据卷,需要删除所有依赖它的容器,并且再删除最后一个依赖容器时使用-v参数.
  25. # docker rm dbdata
  26. # docker rm -v db1
  27. #检查数据卷是否被删掉。
  28. # ll /var/lib/docker/volumes/74*
  29. ls: cannot access '/var/lib/docker/volumes/74*': No such file or directory

数据的备份与恢复

点击(此处)折叠或打开

  1. 备份:
  2. #创建一个数据卷容器的数据,-v创建一个数据卷/udata,并命名为udata。
  3. root@ubuntu:/home/ubuntu# docker run -itd -v /udata --name udata ubuntu:16.04 /bin/bash
  4. 6724be20d5906e3314a2aad62701620f4db624ad6aaba30b79e01df569bafd4d
  5. #连到容器并在挂载的数据卷下新建一个hello_world文件。
  6. root@ubuntu:/home/ubuntu# docker attach 67
  7. root@6724be20d590:/# cd /udata/
  8. root@6724be20d590:/udata# touch hello_world
  9. #再新建一个容器,引用udata容器的数据卷,并创建了一个数据卷映射,将本地文件系统的当前工作目录映射到容器的/udata目录。
  10. #通过tar命令将/udata目录打包到/uback/容器数据卷中,因为/uback映射到本地,所以udata容器的数据卷的数据同时也保存到了本地的当前目录,文件名为uback.tar
  11. root@ubuntu:/home/ubuntu# docker run --volumes-from udata -v $(pwd):/uback ubuntu:16.04 tar cvf /uback/uback.tar /udata
  12. /udata/
  13. /udata/hello_world
  14. tar: Removing leading `/' from member names
  15. root@ubuntu:/home/ubuntu# ls |grep uback.tar
  16. uback.tar
  17. root@ubuntu:/home/ubuntu# docker ps -a
  18. 6bbac93f17c4        ubuntu:16.04        "tar cvf /uback/ub..."   6 minutes ago       Exited (0) 5 minutes ago                              hardcore_goldwasser
  19. 6724be20d590        ubuntu:16.04        "/bin/bash"              18 minutes ago      Exited (0) 3 seconds ago                              udata
  20. #删除已创建的容器
  21. root@ubuntu:/home/ubuntu# docker rm 67 6b

  22. 恢复:
  23. #先声明一个要恢复数据的容器,命名为udata,并且重新创建了数据卷/udata.
  24. root@ubuntu:/home/ubuntu# docker run -itd -v /udata --name udata ubuntu:16.04 /bin/bash
  25. dfbea52e6258c54639bf52ba8457c832211c8547efbd82343bc19c7f736d8e64
  26. root@ubuntu:/home/ubuntu# docker attach df
  27. #查看数据卷udata目录为空。
  28. root@dfbea52e6258:/# ls udata/
  29. root@dfbea52e6258:/#
  30. #再新建一个容器,引用udata容器的数据卷关联到本地目录,并创建另一个数据卷/uback,/uback被映射到本地文件系统中的当前目录。
  31. #本地当前目录存有之前的备份uback.tar,然后通过tar解压到/udata数据卷下,备份好的数据重新恢复到容器的内部了。
  32. root@ubuntu:/home/ubuntu# docker run --volumes-from udata -v $(pwd):/uback ubuntu:16.04 tar xvf /uback/uback.tar
  33. udata/
  34. udata/hello_world
  35. root@ubuntu:/home/ubuntu# docker start df
  36. root@dfbea52e6258:/udata# ls /udata/
  37. hello_world






三、容器互联
容器连接包含源容器和目标容器:
源容器是提供服务一方,对外提供指定服务;
目标容器连接到源容器后,即可使用其所提供的服务。
是除了端口映射以外,另一种跟容器中应用的交互方式。容器互联系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
Docker在两个互联的容器之间创建一个安全隧道,而且不用映射它们的端口到宿主机主机上。在启动容器的时候并没有使用-p和-P标记,避免了暴露敏感端口到外部网络上。

点击(此处)折叠或打开

  1. #创建一个新的数据库容器
  2. # docker run -d --name db training/postgres
  3. #创建一个新的web容器
  4. # docker run -d -P --name web --link db:db training/webapp python app.py
  5. --link 参数格式为 --link name(链接的容器名):alias(别名)
  6. # docker ps
  7. 69263beb89c4        training/webapp     "python app.py"          43 seconds ago      Up 42 seconds       0.0.0.0:32774->5000/tcp   web
  8. 36123189d510        training/postgres   "su postgres -c '/..."   2 minutes ago       Up 2 minutes        5432/tcp                  db
  9. #查看连接状态
  10. # docker inspect --format '{{.HostConfig.Links}}' 69

  11. #使用env命令来查看web容器的环境变量
  12. # docker run --rm --name web2 --link db:db training/webapp env
  13. --rm 在容器终止后会立刻删除容器。*--rm 和 -d参数不能同时使用。
  14. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  15. HOSTNAME=c04ce53afe4a
  16. DB_PORT=tcp://172.17.0.5:5432
  17. DB_PORT_5432_TCP=tcp://172.17.0.5:5432
  18. DB_PORT_5432_TCP_ADDR=172.17.0.5
  19. DB_PORT_5432_TCP_PORT=5432
  20. DB_PORT_5432_TCP_PROTO=tcp
  21. DB_NAME=/web2/db
  22. DB_ENV_PG_VERSION=9.3
  23. HOME=/root
  24. *DB——开头的环境变量是供web容器连接db使用,前缀采用大写的连接别名。*

  25. #创建一个容器终止及删除的容器并进入bash环境
  26. # docker run -it --rm --link db:db training/webapp /bin/bash
  27. #查看/etc/hosts文件
  28. # root@149f01dac63b:/opt/webapp# cat /etc/hosts
  29. 127.0.0.1localhost
  30. ...
  31. #db容器的ip和主机名(容器id)
  32. 172.17.0.5db 36123189d510
  33. #web容器的ip和主机名(容器id)
  34. 172.17.0.6149f01dac63b
  35. root@149f01dac63b:/opt/webapp# apt-get install -yqq inetutils-ping
  36. root@149f01dac63b:/opt/webapp# ping db
  37. 64 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.226 ms
  38. *用户可以连接多个web到db容器上*
代理连接:
在Docker的官网上,可以看到利用ambassador模式可以实现跨主机连接。
例:
redis server:192.168.3.59
redis client:192.168.3.60

点击(此处)折叠或打开

  1. #在主服务器上启动一个redis服务的容器
  2. root@ubuntu:/home/ubuntu# docker run -d --name redis crosbymichael/redis
  3. 03ac9ff378ec596bd7b5f14361131723da3f81f44fb4381c1fd17f6ca671ba2c
  4. #在主服务器上创建一个代理容器ambassador,并连接到redis-server
  5. root@ubuntu:/home/ubuntu# docker run -d --link redis:redis --name redis_ambassador -p 6379:6379 svendowideit/ambassador
  6. 15ca2a5bae492c49012eaa5d2e0fe87aa6b9b76a388ffd5ec368d2eac320c82d
  7. #在客户端主机上创建一个代理容器ambassador,将它连接到主服务器的代理容器ambassador
  8. [root@centos config]# docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://192.168.3.59:6379 svendowideit/ambassador
  9. #在客户端主机上创建一个redis客户端容器
  10. [root@centos config]# docker run -i -t --rm --link redis_ambassador:redis relateiq/redis-cli
  11. redis 172.17.0.5:6379> ping
  12. PONG








09-22 20:11