- 微服务之——docker高级命令
一.映射端口
- 1.先下载 nginx 镜像
[root@localhost ~]# docker pull nginx:1.12.2
1.12.2: Pulling from library/nginx
f2aa67a397c4: Pull complete
e3eaf3d87fe0: Pull complete
38cb13c1e4c9: Pull complete
Digest: sha256:72daaf46f11cc753c4eab981cbf869919bd1fee3d2170a2adeac12400f494728
Status: Downloaded newer image for nginx:1.12.2
docker.io/library/nginx:1.12.2
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 13 months ago 1.84kB
nginx 1.12.2 4037a5562b03 22 months ago 108MB
- 2.打好标签
[root@localhost ~]# docker tag 4037a5562b03 feixiangkeji974907/nginx:v1.12.2
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 13 months ago 1.84kB
shizhengwen/nginx v1.12.2 4037a5562b03 22 months ago 108MB
nginx 1.12.2 4037a5562b03 22 months ago 108MB
![e91bcfec06101aa61a249dfd592ccdbc.png](https://i-blog.csdnimg.cn/blog_migrate/3e4c5fd27c0e27da8ba4bf2f250b4059.jpeg)
- 3.启动nginx镜像
-p 宿主机端口:容器内端口
[root@localhost ~]# docker run --name mynginx -d -p 80:80 feixiangkeji974907/nginx:v1.12.2
89d670a4bc27e3576fe8900aaa17a36a572daff46c12d4995c2fcf35d5107a87

![ea4308dd52cbc04d4ece35df739b5349.png](https://i-blog.csdnimg.cn/blog_migrate/2193291fdf51b1f7e6ae2e25e229b764.jpeg)
查看宿主机端口是否起来了:
[root@localhost ~]# netstat -ntlup | grep 80
tcp6 0 0 :::80 :::* LISTEN 20013/docker-proxy
[root@localhost ~]# curl 127.0.0.1:80
![060ff265006740c601495b164d7476e6.png](https://i-blog.csdnimg.cn/blog_migrate/1b914ca3da00d39099eef1142608f6df.jpeg)
二.挂载数据(以nginx为例)
- 1、用户家目录下创建目录
[root@localhost ~]# cd
[root@localhost ~]# mkdir html
[root@localhost ~]# cd html/
- 2、下载一个html 网页实例
[root@localhost html]# wget www.baidu.com -O index.html
- 3、启动nginx
-v 宿主机目录: 容器内目录
[root@localhost html]# docker run --name nginx_with_baidu -d -p 82:80 -v /root/html:/usr/share/nginx/html feixiangkeji974907/nginx:v1.12.2
2fc055d4ceddf0fa30e6c5d78038c5d888bd286c6c31f0cd0cf52309d7535c91

![82fd7e456143402efd5751265b9ff60a.png](https://i-blog.csdnimg.cn/blog_migrate/0df2c3cf74ea64e5fcad926c402eb4de.jpeg)
三.传递环境变量
- 1、启动镜像
-e key键=value值
[root@localhost html]# docker run --rm -e E_hehe=world --name test feixiangkeji974907/nginx:v1.12.2 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e306a8baf34b
E_hehe=world
NGINX_VERSION=1.12.2-1~stretch
NJS_VERSION=1.12.2.0.1.14-1~stretch
HOME=/root

![d234f363966b67c34e2754a1d752b4c5.png](https://i-blog.csdnimg.cn/blog_migrate/97a24880d166868ef9c8600c5076497f.jpeg)
四.容器内安装软件
- 1、先进入到容器内
[root@localhost ~]# docker exec -ti nginx_with_baidu /bin/bash
假如 curl 命令是容器里没有的
root@c09cc1eeb5df:/# curl
bash: curl: command not found
- 2、我们要想给容器转一个 curl 命令就要先去更新 apt 的一个源
tee /etc/apt/sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-ffree contrib
deb http://mirrirs.163.com/dobian/ jessie-updates main non-free contrib
EOF
![50cf2602a8cebab171d4f6f0963cbf86.png](https://i-blog.csdnimg.cn/blog_migrate/349398255445b0a27cc6a6a4745ef64b.jpeg)
- 3、下载 curl
root@2fc055d4cedd:/# apt-get update && apt-get install -y curl
- 4、再安装个lrzsz
root@2fc055d4cedd:/# apt-get install lrzsz -y
- 5、固化镜像 (把刚刚下载安装过的工具镜像给固化)
[root@localhost ~]# docker commit -p c09cc1eeb5df feixiangkeji974907/nginx:curl
- 6、把镜像推送到仓库
[root@localhost ~]# docker push feixiangkeji974907/nginx:curl
五、容器自启动
Docker提供了restart policy机制,可以在容器退出或者Docker重启时控制容器能够自启动。这种Restart policy可以保证相关容器按照正确顺序启动。虽然也可以通过进程监控的方式(如systemd)来完成这种动作,但Docker还是建议尽量避免使用进程监控的方式来 "自启动" 容器。
在使用docker run启动容器时,使用--restart参数来设置:
[root@localhost ~]# docker run -m 512m --memory-swap 1G -it -p 58080:8080 --restart=always
--name bvrfis
--restart具体参数值详细信息:
no - 容器退出时,不重启容器;
on-failure - 只有在非0状态退出时才从新启动容器;
always - 无论退出状态是如何,都重启容器;
如果创建时未指定 --restart=always ,可通过update 命令设置
docker update --restart=always 容器名称
六、容器拷贝文件
- 1、从容器里面拷文件到宿主机
【在宿主机里面执行以下命令】
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
- 2、从宿主机拷文件到容器里面
【在宿主机里面执行如下命令】
docker cp:要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
![17f315a7294ae821989b4e047d3718fe.gif](https://i-blog.csdnimg.cn/blog_migrate/58cd7f284670526885f88cdafecfffb0.gif)