起源
docker教程满大街,为啥要再写?
- 看了别人的教程,还是不会
- 命令太多记不住
- 满大街的教程大同小异
- 我们要学会自己看官网
docker介绍
- 别人的教程写太多了 docker官网 看看吧
docker安装、docker-compose安装
- 请选用docker-ce(社区版免费)
- 我们还是要学会看 英文官网 如何安装docker
如果安装的是mac版本无需再单独 安装docker-compose 其他版本请参考官网
- 最后,命令行
docker-compose version一下
docker-compose部署
- 这里要接触到 docker 的 network 4个模式中的
bridge(默认)、host
注意事项:macos与windows上
docker的host模式是不支持的,桌面版是靠虚拟机模拟实现linux
部署nginx
相关链接
- docker-compose官网 compose-file
- docker hub的 nginx
手把手一步步
- 新建目录并命名、在新建目录下新建
docker-compose.yaml,yml文件后缀也是可以的 - 内容如下
#
# https://docs.docker.com/compose/compose-file/
# 指定format的版本,我也不知道干啥的
version: "3.7"
# compose file的三大金刚(service、networks、volumes)之一,用来定义应用
services:
# web这个是随便命名的
web:
# 指定nginx镜像
image: nginx
# 指定映射端口8088(前一个),到容器内80(后一个)
ports:
- 8088:80
- 运行一发
docker-compose up,如果需要后台运行只需要多加一个-d参数,我们也可以运行docker-compose run --help查看帮助
- 现在可以访问 本地localhost:8088 看到nginx欢迎您说明好了
还有优化空间
- 将容器内nginx配置拷贝出来放到本地,后面通过文件映射的方式让容器读取你指定的配置
- 使用host模式绕过一层docker路由将容器内端口暴露(安全性又是个问题)
如何指定静态文件和配置映射
- volumes 字段配置,我的是这样的:
# https://docs.docker.com/compose/compose-file/
# 指定format的版本,我也不知道干啥的
version: "3.7"
# compose file的三大金刚(service、networks、volumes)之一,用来定义应用
services:
# web这个是随便命名的
web:
# 指定nginx镜像
image: nginx
# 指定映射外部端口8088(前一个),到容器内80(后一个)
ports:
- 8088:80
volumes:
- ./html:/usr/share/nginx/html
- ./nginx:/etc/nginx
- 指定了当前目录下的html文件夹映射到
/usr/share/nginx/html目录,nginx文件夹映射到/etc/nginx,要映射到哪怎么知道呢?当然是前面给出的docker hub的 nginx里面找到的,当然,你要是对nginx配置熟悉的话另说 - 在刚才的nginx容器里面拷贝出配置文件来
# 查看刚才启动的容器,复制容器id或者name(这里我们不一样)
docker container ls
# 复制容器内的静态文件到当前目录,用容器id
docker container cp bc1fbbe11a2b:/usr/share/nginx/html .
# 复制容器内的配置文件到当前目录,也可以用容器name
docker container cp docker_web_1:/etc/nginx .
ctrl+c结束docker-compose up或者docker-compose down结束docker-compose up -d(注意命令行窗口切换问题)- 再次启动容器
docker-compose up我们就使用的自己的静态文件和nginx配置了
6. 从此以后再也不用担心容器重启配置文件无法保存的问题了
如何使用host模式
再加一句 network_mode: host 重启容器就好了
# https://docs.docker.com/compose/compose-file/
# 指定format的版本,我也不知道干啥的
version: "3.7"
# compose file的三大金刚(service、networks、volumes)之一,用来定义应用
services:
# web这个是随便命名的
web:
# 指定nginx镜像
image: nginx
volumes:
- ./html:/usr/share/nginx/html
- ./nginx:/etc/nginx
# 指定映射端口8088(前一个),到容器内80(后一个)
ports:
- 8088:80
network_mode: host
注意加上之后使用的host模式直接将容器内端口暴露在外面,所以上面的
ports:
- 8088:80
将自动失效,而且前面还说了,macos与Windows桌面版host模式无效的问题,需要在linux上操作
线上部署问题
记得带上-d参数,阿里云之类的可能涉及到端口开放之类的问题,需要后台设置
部署mysql
version: "3.7"
services:
# db我起的名字
db:
# 这里学到一个新知识,设置运行后容器的名字为“mydb”
container_name: mydb
image: mysql
# 抄官网的
command: --default-authentication-plugin=mysql_native_password
restart: always
# 环境变量
environment:
# 数据库root密码,这个镜像特殊的东西,镜像说明里面找的
MYSQL_ROOT_PASSWORD: db_pwd.
network_mode: host
ports:
- 3306:3306
volumes:
- ./conf.d:/etc/mysql/conf.d
- ./mysql:/var/lib/mysql
手把手教学
- docker hub mysql 链接
- 按照之前的套路,参考官网说明->写yaml配置->复制容器内的文件到本地->
volumes映射配置与数据存储 - 启动容器
- 可以用navicat 之类的连接数据库了,好像都不需要去设置什么允许远程连接
结语
- 欢迎各位的批评指导文中的疏漏之处