docker学习
docker服务命令


docker镜像命令

docker容器命令


docker数据卷




docker 应用部署
一、部署MySQL
| //搜索mysql镜像 |
| docker search mysql |
| |
| 拉取mysql镜像 |
| docker pull mysql:5.7 |
| |
| docker images |
| |
| |
| 创建容器,设置端口映射、目录映射 |
| |
| mkdir ~/mysql |
| cd ~/mysql |
| |
| docker run -id \ |
| -p 3307:3306 \ |
| --name=mysql \ |
| -v $PWD/conf:/etc/mysql/conf.d \ |
| -v $PWD/logs:/logs \ |
| -v $PWD/data:/var/lib/mysql \ |
| -e MYSQL_ROOT_PASSWORD=123456 \ |
| mysql:5.7 |
| |
| 进入容器,操作mysql |
| docker exec –it mysql /bin/bash |
| |
参数说明:
- -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
- -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
- -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
- -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
- -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
二、部署Tomcat
- 搜索tomcat镜像
- 拉取tomcat镜像
- 创建容器,设置端口映射、目录映射
| # 在/root目录下创建tomcat目录用于存储tomcat数据信息 |
| mkdir ~/tomcat |
| cd ~/tomcat |
| docker run -id --name=c_tomcat \ |
| -p 8080:8080 \ |
| -v $PWD:/usr/local/tomcat/webapps \ |
| tomcat |
- 使用外部机器访问tomcat
三、部署Nginx
- 搜索nginx镜像
- 拉取nginx镜像
- 创建容器,设置端口映射、目录映射
| # 在/root目录下创建nginx目录用于存储nginx数据信息 |
| mkdir ~/nginx |
| cd ~/nginx |
| mkdir conf |
| cd conf |
| # 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容 |
| vim nginx.conf |
| user nginx; |
| worker_processes 1; |
| |
| error_log /var/log/nginx/error.log warn; |
| pid /var/run/nginx.pid; |
| |
| |
| events { |
| worker_connections 1024; |
| } |
| |
| |
| http { |
| include /etc/nginx/mime.types; |
| default_type application/octet-stream; |
| |
| log_format main '$remote_addr - $remote_user [$time_local] "$request" ' |
| '$status $body_bytes_sent "$http_referer" ' |
| '"$http_user_agent" "$http_x_forwarded_for"'; |
| |
| access_log /var/log/nginx/access.log main; |
| |
| sendfile on; |
| #tcp_nopush on; |
| |
| keepalive_timeout 65; |
| |
| #gzip on; |
| |
| include /etc/nginx/conf.d/*.conf; |
| } |
| |
| |
| docker run -id --name=c_nginx \ |
| -p 80:80 \ |
| -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ |
| -v $PWD/logs:/var/log/nginx \ |
| -v $PWD/html:/usr/share/nginx/html \ |
| nginx |
- 参数说明:
- -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
- -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
- -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
- 使用外部机器访问nginx
四、部署Redis
- 搜索redis镜像
- 拉取redis镜像
- 创建容器,设置端口映射
| docker run -id --name=c_redis -p 6379:6379 redis:5.0 |
- 使用外部机器连接redis
| ./redis-cli.exe -h 192.168.149.135 -p 6379 |
Dockerfile
关键字(大写) |
作用 |
备注 |
FROM |
指定父镜像 |
指定dockerfile基于那个image构建 |
MAINTAINER |
作者信息 |
用来标明这个dockerfile谁写的 |
LABEL |
标签 |
用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN |
执行命令 |
执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD |
容器启动命令 |
提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT |
入口 |
一般在制作一些执行就关闭的容器中会使用 |
COPY |
复制文件 |
build的时候复制文件到image中 |
ADD |
添加文件 |
build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV |
环境变量 |
指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG |
构建参数 |
构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME |
定义外部可以挂载的数据卷 |
指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME ["目录"] |
EXPOSE |
暴露端口 |
定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR |
工作目录 |
指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER |
指定执行用户 |
指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK |
健康检查 |
指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD |
触发器 |
当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL |
发送信号量到宿主机 |
该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL |
指定执行脚本的shell |
指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
一、原理



镜像制作
制作dockerfile文件
| FROM java:8 |
| MAINTAINER mikasa<wwmhyy@163.com> |
| ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar |
| CMD java -jar app.jar |
| |
执行构建镜像
| docker build -f ./springboot_dockerfile -t app . |
运行
| docker run -id -p 9000:8080 app |
| |
| |
| 访问 http://127.0.0.1:9001/hello |
案例


Docker Compose 服务编排

一、安装Docker Compose
| # Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 |
| curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose |
| # 设置文件可执行权限 |
| chmod +x /usr/local/bin/docker-compose |
| # 查看版本信息 |
| docker-compose -version |
二、卸载Docker Compose
| # 二进制包方式安装的,删除二进制文件即可 |
| rm /usr/local/bin/docker-compose |
三、 使用docker compose编排nginx+springboot项目
- 创建docker-compose目录
| mkdir ~/docker-compose |
| cd ~/docker-compose |
- 编写 docker-compose.yml 文件
| version: '3' |
| services: |
| nginx: |
| image: nginx |
| ports: |
| - 80:80 |
| links: |
| - app |
| volumes: |
| - ./nginx/conf.d:/etc/nginx/conf.d |
| app: |
| image: app |
| expose: |
| - "8080" |
- 创建./nginx/conf.d目录
- 在./nginx/conf.d目录下 编写itheima.conf文件
| server { |
| listen 80; |
| access_log off; |
| |
| location / { |
| proxy_pass http://app:8080; |
| } |
| |
| } |
- 在~/docker-compose 目录下 使用docker-compose 启动容器
- 测试访问
| http://192.168.149.135/hello |
Docker 私有仓库
一、私有仓库搭建
| # 1、拉取私有仓库镜像 |
| docker pull registry |
| # 2、启动私有仓库容器 |
| docker run -id --name=registry -p 5000:5000 registry |
| # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功 |
| # 4、修改daemon.json |
| vim /etc/docker/daemon.json |
| # 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip |
| {"insecure-registries":["43.138.188.104:5000"]} |
| # 5、重启docker 服务 |
| systemctl restart docker |
| docker start registry |
| |
二、将镜像上传至私有仓库
| # 1、标记镜像为私有仓库的镜像 |
| docker tag centos:7 私有仓库服务器IP:5000/centos:7 |
| |
| # 2、上传标记的镜像 |
| docker push 私有仓库服务器IP:5000/centos:7 |
| |
三、 从私有仓库拉取镜像
| #拉取镜像 |
| docker pull 私有仓库服务器ip:5000/centos:7 |


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通