docker端口映射
1 端口映射(docker run -p)
使用docker的时候 外界访问docker容器中的服务或端口,需要使用端口映射.本质类似于iptables防火墙的端口映射.
应用场景: 未来容器需要被外界访问(80端口).需要暴漏在外界一个端口.
用户通过端口访问容器中的某个端口.
实现方法:docker run通过-p选项实现.
本质是通过iptables nat规则实现的.nat表中创建了docker自定义的链
比如说 docker run -d --name "oldboy_nginx_1.20.2-apline" -p 8888:80 nginx:1.20.2-apline
1) 背后做了什么?
添加了对应防火墙规则 iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8888 -j DNAT --to-destination 172.17.0.10:80
开启内核转发功能(需要我们自己开启)
2) 用户访问的时候经历了什么?
3) 端口映射案例
a) 1对1端口映射
docker run |
|
-p选项(小写字母P) 宿主机端口:容器中的端口 | -p 80:80 -p 443:443 |
-p :容器中端口 | -p :80 表示宿主机端口随机,很少用. |
-p 端口范围:端口范围 | 80-88:80-88 |
[root@docker01.long.cn [ ~]# docker run -d -p 80:80 --name "long_ngx_alpine_v1" nginx:alpine
8107daac78858674eaa23197b978172ef302a8dbfaa697e9d453f9e923bee49e
b) 映射多个端口
映射8080,8081,8082 到容器中容器中也是8080,8081,8082
一个一个写
docker run -d -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 86:80 nginx:1.20.2-alpine
docker port hopeful_northcutt(容器名字或id)
表示连续
docker run -d -p 8084-8086:8080-8082 -p 88:80 nginx:1.20.2-alpine
c) ip绑定端口
显示用户只能通过宿主机的某个网卡连接这个端口.
安全防护作用.
[root@docker01.long.cn [ ~]# docker run -d --name "ngx1_bind_ip" -p 172.16.1.81:12356:80 nginx:alpine
5db804f9582f13b4b5aeb13cf56b6399796123bf45729328a69138c791124f76
[root@docker01.long.cn [ ~]# docker ps |grep ngx1
5db804f9582f nginx:alpine "/docker-entrypoint.…" 39 seconds ago Up 38 seconds 172.16.1.81:12356->80/tcp ngx1_bind_ip
[root@docker01.long.cn [ ~]# docker port ngx1_bind_ip | column -t
80/tcp -> 172.16.1.81:12356
4) 小结
熟练掌握通过-p选项配置端口映射映射1个或多个端口即可.
掌握用户访问与docker
了解: -p背后做了什么
2数据卷挂载
1) 概述
这里我们想个问题,创建了一个容器,容器里面存放很多代码,数据,软件包等等信息,不小心删除容器 rm -f .
重新创建名字相同的容器,问数据还有没有?
如何解决数据持久化问题? 数据卷(挂载),让数据永久保存在宿主机中.
2) 实战
不使用数据卷,数据会丢失.
数据卷使用 -v选项
docker run
-v 指定要挂载的目录/文件
-v 宿主机的路径:容器内部路径
案例1: 使用数据卷挂载index.html到容器中的/usr/share/nginx/html/index.html
挂载文件 宿主机的/app/docker/code/index.html 挂载到容器/usr/share/nginx/html/index.html
mkdir -p /app/docker/test/code
echo docker.oldboylinux.cn data volumne >/app/docker/test/code/index.html
挂载文件
docker run -d name "docker_volumnt_ngx_v1" -p 80:80
-v /app/docker/code/index.html:/usr/share/nginx/html/index.html
nginx:alpine
可以修改index.html并观察页面变化.
注意:使用vi/vim/sed -i修改,需要重启下容器,因为对应文件inode变化,导致容器无法识别.
查看容器挂载的数据卷
案例2 :挂载代码目录,配置文件目录
用数据卷挂载:代码目录.
用数据卷挂载:配置文件,配置文件目录.
用数据卷挂载:数据目录(数据库)
还可以用于日志.
nginx:alpine镜像
配置文件子: /app/docker/restart/conf/nginx/conf.d/ >/etc/nginx/conf.d/
配置文件主: /app/docker/restart/conf/nginx/nginx.conf >/etc/nginx/nginx.conf
站点目录: /app/docker/restart/code/ >/app/code/restart/
[root@docker01.long.cn [ ~]# mkdir -p /app/docker/restart/{conf,code}
[root@docker01.long.cn [ /app/docker/restart]# mkdir -p conf/nginx/
[root@docker01.long.cn [ /app/docker/restart]# docker cp docker_volumnt_ngx_v1:/etc/nginx/nginx.conf conf/nginx/
[root@docker01.long.cn [ /app/docker/restart]# docker cp docker_volumnt_ngx_v1:/etc/nginx/conf.d conf/nginx/
对目录进行挂载
[root@docker01.long.cn [ ~]# docker run -d --name "long_H5_volume_v1" -p 80:80
> -v /app/docker/restart/conf/nginx/conf.d/:/etc/nginx/conf.d/
> -v /app/docker/restart/conf/nginx/nginx.conf:/etc/nginx/nginx.conf
> -v /app/docker/restart/code/:/app/code/restart/
> restart=always
> nginx:alpine
配置文件
[root@docker01.long.cn [ /app/docker/restart]# cat conf/nginx/conf.d/H5.conf
server {
listen 80;
server_name H5.long.cn;
root /app/code/restart;
location / {
index index.html;
}
# location ~* .css$ {
# root /app/code/restart/css;
# }
}
案例3: 创建数据卷空间
应用场景: 只关注容器中的数据不丢,不关注数据具体放在哪里.
1. 创建数据卷
[root@docker01.long.cn [ ~]# docker volume
create inspect ls prune rm
[root@docker01.long.cn [ ~]# docker volume create long_data
long_data
2. 查看数据卷
3. 挂载数据卷
[root@docker01.long.cn [ ~]# docker run -d --name "longg_volume_space" -v long_data:/var/log/nginx/ nginx:alpine
047d83727f8eb7a94305a71d34e491485157b3afdb9c43c4370005afb422d273
查看该容器日志,可以在其目录下查看
nginx容器的日志默认是输出到docker标准输出和标准错误输出的,而不是存放在文件中.
未来查看日志的时候,不用进入到容器,然后tail/less使用命令查看.
直接使用 docker logs 容器id或名字 就可以看日志. 相当于查看access.log或error.log
案例4:随机数据卷(较少使用)
docker run -d name "nginx_vol_longlogdatav2" - p :80 -v :/var/log/nginx/ nginx:1.20.2-alpine
更多数据卷用法 Volumes | Docker Docs
容器时区问题:
3) 数据卷使用与容器架构
4) 小结
熟练掌握挂载指定的目录或文件到容器中即可.
-v
docker volume