1、docker run -P 用法
点击(此处)折叠或打开
- # docker pull nginx
- # docker images
- nginx latest c59f17fe53b0 2 weeks ago 108MB
- # docker run -itd -P --name nginx nginx
- -P 对外映射一个随机端口
- #查看本地ip端口范围
- # cat /proc/sys/net/ipv4/ip_local_port_range
- 3276860999
- # docker ps
- 547cfd66e68c nginx "nginx -g 'daemon ..." 21 seconds ago Up 20 seconds 0.0.0.0:32773->80/tcp nginx
- #查看nginx日志信息
- # docker logs -f nginx
- # netstat -nlp |grep 32773
- tcp6 0 0 :::32773 :::* LISTEN 5810/docker-proxy
- # curl http://localhost:32773
- <!DOCTYPE html>
- <html>
- <head>
- <title>Welcome to nginx!>
- <style>
- body {
- width: 35em;
- margin: 0 auto;
- font-family: Tahoma, Verdana, Arial, sans-serif;
- }
- </style>
- </head>
- <body>
- <h1>Welcome to nginx!>
- <p>If you see this page, the nginx web server is successfully installed and
- working. Further configuration is required.</p>
- <p>For online documentation and support please refer to
- <a href="http://nginx.org/">nginx.org</a>.<br/>
- Commercial support is available at
- <a href="http://nginx.com/">nginx.com</a>.</p>
- <p><em>Thank you for using nginx.</em></p>
- </body>
- </html>
2、docker run -p用法
映射所有接口地址:hostport:containerport
点击(此处)折叠或打开
- #本地的8080端口映射到容器的5000端口
- # docker run -d -p 8080:5000 training/webapp python app.py
- f20bce4b0263352b0887b3626bf5617a24f395b13330462c43af985ef3b1e445
- # docker ps
- f20bce4b0263 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:8080->5000/tcp stoic_perlman
- # curl http://192.168.3.59:8080
- Hello world!
- # docker logs -f f20bce4b0263
- * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
- 192.168.3.59 - - [14/Nov/2017 08:49:03] "GET / HTTP/1.1" 200 -
- 192.168.113.5 - - [14/Nov/2017 08:49:38] "GET / HTTP/1.1" 200 -
点击(此处)折叠或打开
- #映射使用一个特定地址,这里用127.0.0.1为例
- # docker run -d -p 127.0.0.1:8081:5000 training/webapp python app.py
- b8c4c38f63d521489eb05c03ef476619bb09048a63770f033ba1232a9fc96730
- # docker ps
- b8c4c38f63d5 training/webapp "python app.py" 2 seconds ago Up 1 second 127.0.0.1:8081->5000/tcp elated_jang
- # curl http://127.0.0.1:8081
- Hello world!
- # docker logs -f b8c4c38f63d5
点击(此处)折叠或打开
- #绑定ip任意的端口映射到容器端口,本地主机会自动分配一个端口
- # docker run -d -p 127.0.0.1::5000 training/webapp python app.py
- 7b220d0d49488a7ed99cbf43798ff355e99aa9ae3b469c42fdf8d6e71c735f75
- # docker ps
- 7b220d0d4948 training/webapp "python app.py" 4 seconds ago Up 3 seconds 127.0.0.1:32768->5000/tcp agitated_jackson
- # curl http://127.0.0.1:32768
- Hello world!
- #使用udp标记来指定udp端口
- # docker run -d -p 8080:5000/udp training/webapp python app.py
- #查看影射端口配置
- # docker port f20bce4b0263
- 5000/tcp -> 0.0.0.0:8080
- # docker port f20bce4b0263 5000
- 0.0.0.0:8080
-p也可以使用多次来绑定多个端口
点击(此处)折叠或打开
- # docker run -d -p 8000:5000 -p 8001:5000 --name web training/webapp python app.py
- # docker ps
- 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
- # 查看容易的名字
- # docker inspect -f "{{ .Name }}" f452e2d55579
- /web
- # netstat -nlp
- tcp6 0 0 :::8000 :::* LISTEN 8276/docker-proxy
- tcp6 0 0 :::8001 :::* LISTEN 8266/docker-proxy
- # curl http://192.168.3.59:8000
- Hello world!
- # curl http://192.168.3.59:8001
- Hello world!
数据卷是一个可供一个或多个容器使用的特殊目录。
点击(此处)折叠或打开
- #创建宿主机数据卷/tmp/test并挂载到容器中/opt/test下;
- #默认情况如果只声明数据卷而没有映射到宿主机上的具体目录,Docker会在/var/lib/docker/volumes下分配一个具有唯一名字的目录给该数据卷。
- # docker run -d -P -v /tmp/test:/opt/test training/webapp python app.py
- # docker inspect --format '{{.Mounts}}' ba
- [{bind /tmp/test /opt/test true }]
- #通过本地挂载目录到容器的数据卷,宿主机对目录内的改变会同步反映到容器中,反之也一样。
- # docker run --rm -it -v /tmp/test:/opt/test ubuntu:latest /bin/bash
- # root@fc84ee9838fe:/# cd /opt/test/
- # root@fc84ee9838fe:/opt/test# touch test.txt
- # root@ubuntu:/home/ubuntu# ll /tmp/test/
- -rw-r--r-- 1 root root 0 11月 21 18:38 test.txt
- #数据卷容器是指一个专门用于挂载数据卷的容器,以供其它容器引用和使用。
- # docker run -d -v /dbdata --name dbdata training/postgres
- 055f7ceebee4cc35027e4e9967c80313817d7b994de615439bd6f6fce0e79321
- # docker run -d --volumes-from=dbdata --name db1 training/postgres
- b2f4ca6f7cdbf321e06680b86942617f5604bb8aecead8260aec05cb2fe1484c
- #以下可以看出dbdata和db1使用同一个数据卷/dbdata
- # docker inspect --format '{{ .Mounts }}' dbdata
- [{volume 74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39 /var/lib/docker/volumes/74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39/_data /dbdata local true }]
- # docker inspect --format '{{ .Mounts }}' db1
- [{ 74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39 /var/lib/docker/volumes/74c19f4c2985f74ee1d3dcec94a21c4616917dee9a42e01aacb83c354ad3bc39/_data /dbdata local true }]
- # ll /var/lib/docker/volumes/74*
- drwxr-xr-x 2 root root 4096 11月 21 18:44 _data/
- #容器的停止和删除都不会导致数据卷本身删除,如需删除数据卷,需要删除所有依赖它的容器,并且再删除最后一个依赖容器时使用-v参数.
- # docker rm dbdata
- # docker rm -v db1
- #检查数据卷是否被删掉。
- # ll /var/lib/docker/volumes/74*
- ls: cannot access '/var/lib/docker/volumes/74*': No such file or directory
点击(此处)折叠或打开
- 备份:
- #创建一个数据卷容器的数据,-v创建一个数据卷/udata,并命名为udata。
- root@ubuntu:/home/ubuntu# docker run -itd -v /udata --name udata ubuntu:16.04 /bin/bash
- 6724be20d5906e3314a2aad62701620f4db624ad6aaba30b79e01df569bafd4d
- #连到容器并在挂载的数据卷下新建一个hello_world文件。
- root@ubuntu:/home/ubuntu# docker attach 67
- root@6724be20d590:/# cd /udata/
- root@6724be20d590:/udata# touch hello_world
- #再新建一个容器,引用udata容器的数据卷,并创建了一个数据卷映射,将本地文件系统的当前工作目录映射到容器的/udata目录。
- #通过tar命令将/udata目录打包到/uback/容器数据卷中,因为/uback映射到本地,所以udata容器的数据卷的数据同时也保存到了本地的当前目录,文件名为uback.tar
- root@ubuntu:/home/ubuntu# docker run --volumes-from udata -v $(pwd):/uback ubuntu:16.04 tar cvf /uback/uback.tar /udata
- /udata/
- /udata/hello_world
- tar: Removing leading `/' from member names
- root@ubuntu:/home/ubuntu# ls |grep uback.tar
- uback.tar
- root@ubuntu:/home/ubuntu# docker ps -a
- 6bbac93f17c4 ubuntu:16.04 "tar cvf /uback/ub..." 6 minutes ago Exited (0) 5 minutes ago hardcore_goldwasser
- 6724be20d590 ubuntu:16.04 "/bin/bash" 18 minutes ago Exited (0) 3 seconds ago udata
- #删除已创建的容器
- root@ubuntu:/home/ubuntu# docker rm 67 6b
- 恢复:
- #先声明一个要恢复数据的容器,命名为udata,并且重新创建了数据卷/udata.
- root@ubuntu:/home/ubuntu# docker run -itd -v /udata --name udata ubuntu:16.04 /bin/bash
- dfbea52e6258c54639bf52ba8457c832211c8547efbd82343bc19c7f736d8e64
- root@ubuntu:/home/ubuntu# docker attach df
- #查看数据卷udata目录为空。
- root@dfbea52e6258:/# ls udata/
- root@dfbea52e6258:/#
- #再新建一个容器,引用udata容器的数据卷关联到本地目录,并创建另一个数据卷/uback,/uback被映射到本地文件系统中的当前目录。
- #本地当前目录存有之前的备份uback.tar,然后通过tar解压到/udata数据卷下,备份好的数据重新恢复到容器的内部了。
- root@ubuntu:/home/ubuntu# docker run --volumes-from udata -v $(pwd):/uback ubuntu:16.04 tar xvf /uback/uback.tar
- udata/
- udata/hello_world
- root@ubuntu:/home/ubuntu# docker start df
- root@dfbea52e6258:/udata# ls /udata/
- hello_world
三、容器互联
容器连接包含源容器和目标容器:
源容器是提供服务一方,对外提供指定服务;
目标容器连接到源容器后,即可使用其所提供的服务。
是除了端口映射以外,另一种跟容器中应用的交互方式。容器互联系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
Docker在两个互联的容器之间创建一个安全隧道,而且不用映射它们的端口到宿主机主机上。在启动容器的时候并没有使用-p和-P标记,避免了暴露敏感端口到外部网络上。
点击(此处)折叠或打开
- #创建一个新的数据库容器
- # docker run -d --name db training/postgres
- #创建一个新的web容器
- # docker run -d -P --name web --link db:db training/webapp python app.py
- --link 参数格式为 --link name(链接的容器名):alias(别名);
- # docker ps
- 69263beb89c4 training/webapp "python app.py" 43 seconds ago Up 42 seconds 0.0.0.0:32774->5000/tcp web
- 36123189d510 training/postgres "su postgres -c '/..." 2 minutes ago Up 2 minutes 5432/tcp db
- #查看连接状态
- # docker inspect --format '{{.HostConfig.Links}}' 69
- #使用env命令来查看web容器的环境变量
- # docker run --rm --name web2 --link db:db training/webapp env
- --rm 在容器终止后会立刻删除容器。*--rm 和 -d参数不能同时使用。
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- HOSTNAME=c04ce53afe4a
- DB_PORT=tcp://172.17.0.5:5432
- DB_PORT_5432_TCP=tcp://172.17.0.5:5432
- DB_PORT_5432_TCP_ADDR=172.17.0.5
- DB_PORT_5432_TCP_PORT=5432
- DB_PORT_5432_TCP_PROTO=tcp
- DB_NAME=/web2/db
- DB_ENV_PG_VERSION=9.3
- HOME=/root
- *DB——开头的环境变量是供web容器连接db使用,前缀采用大写的连接别名。*
- #创建一个容器终止及删除的容器并进入bash环境
- # docker run -it --rm --link db:db training/webapp /bin/bash
- #查看/etc/hosts文件
- # root@149f01dac63b:/opt/webapp# cat /etc/hosts
- 127.0.0.1localhost
- ...
- #db容器的ip和主机名(容器id)
- 172.17.0.5db 36123189d510
- #web容器的ip和主机名(容器id)
- 172.17.0.6149f01dac63b
- root@149f01dac63b:/opt/webapp# apt-get install -yqq inetutils-ping
- root@149f01dac63b:/opt/webapp# ping db
- 64 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.226 ms
- *用户可以连接多个web到db容器上*
在Docker的官网上,可以看到利用ambassador模式可以实现跨主机连接。
例:
redis server:192.168.3.59
redis client:192.168.3.60
点击(此处)折叠或打开
- #在主服务器上启动一个redis服务的容器
- root@ubuntu:/home/ubuntu# docker run -d --name redis crosbymichael/redis
- 03ac9ff378ec596bd7b5f14361131723da3f81f44fb4381c1fd17f6ca671ba2c
- #在主服务器上创建一个代理容器ambassador,并连接到redis-server
- root@ubuntu:/home/ubuntu# docker run -d --link redis:redis --name redis_ambassador -p 6379:6379 svendowideit/ambassador
- 15ca2a5bae492c49012eaa5d2e0fe87aa6b9b76a388ffd5ec368d2eac320c82d
- #在客户端主机上创建一个代理容器ambassador,将它连接到主服务器的代理容器ambassador
- [root@centos config]# docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://192.168.3.59:6379 svendowideit/ambassador
- #在客户端主机上创建一个redis客户端容器
- [root@centos config]# docker run -i -t --rm --link redis_ambassador:redis relateiq/redis-cli
- redis 172.17.0.5:6379> ping
- PONG