docker学习
1. 什么是docker
docker简单来说就是加速、构建、分享、运行我们的应用
方便应用下载、运行应用 例如WeGame游戏客户端,可以直接在WeGame上下载自己想玩的游戏,也可以直接在WeGame启动自己想玩的游戏
2. docker如何工作
3. docker发布自己制作的镜像
4. 做个实验:使用docker下载nginx 并修改首页页面内容,并且将内容发布至社区中共所有人使用
完成步骤:
docker指定版本查看页面✈
- 下载nginx
1
2
3
4
5
6
7
8
9
10
11# 1. 使用名称查看都有那些版本
docker search nginx
# 2. 下载 nginx(默认下载最新的)
docker pull nginx
# 3. 查看下载的镜像
docker images
# 4. 删除镜像
docker rmi 镜像ID - 容器命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 1. 运行容器
docker run nginx(要加版本号,否则还会执行docker pull 下载最新版本)
有很多参数 建议先查看 docker run --help 看看
例如 -d 后台运行,不至于阻塞命令行等
-p 端口映射 -p 页面访问端口:docker中nginx端口
docker run -d --name mynginx -p 80:80 nginx
# 2. 停止容器
docker stop 容器ID
# 3. 启动容器
docker start 容器ID
# 4. 重启容器
docker restart 容器ID
# 5. 查看状态
docker status
# 6. 查看日志
docker logs
# 7. 删除容器
docker rm 容器ID (需要先停止容器)
docker rm -f 容器ID(强制删除,不需要停止) - 修改页面内容
1
2
3
4
5
6
7
8
9
10# 使用命令进行数据交互 固定参数 -it
docker exec -it mynginx(你的容器名称) /bin/bash(使用bash控制台进行交互)
# 进入容器内部后打开页面
cd /usr/share/nginx/html
# 使用 vi命令进行修改页面会发现报错 容器为了保持轻量级 并未使用vi
暂时使用手动修改吧
echo "<h1>hello Docker muye</h1>" > index.html
刷新页面会显示 hello Docker muye - 保存镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 推出内部容器
exit
# 保存容器
docker commit -m "update index.html(这里写的是修改内容)" mynginx(容器名称,也可以是容器ID) mynginx(指定保存的镜像):v1.0 (版本号)
# 使用命令查看到自己的镜像
docker images
# 使用命令压缩成tar
docker save -o mynginx.tar mynginx:v1.0
# 加载镜像 (执行完命令后,docker镜像里边就有该镜像了)
docker load -i mynginx.tar - 发布社区
现在这里注册一个社区账号1
2
3
4
5
6
7
8
9
10
11# 登录到 dockerhub中
docker login
输入用户名
输入密码
显示Login successded 则登陆成功
# 给镜像修改名字 docker官方要求
docker tag mynginx:v1.0 用户名/mynginx:v1.0
# 推送社区
docker push 用户名/mynginx:v1.0
搞了好几天也没有办法正常下载nginx,重装服务器系统都试了好几次没有用,最后发现是阿里云的镜像有问题,换成腾讯云后立刻就好 还是得雨露均沾啊
1 | sudo tee /etc/docker/daemon.json <<-'EOF' |
5. docker下的nginx目录挂载
1 | docker run -d --name mynginx -p 80:80 -v /limuye/nginx/html:/usr/share/nginx/html nginx |
docker compose
docker compose中yml文件的写法
1 | name: myblog |
service: 要启动的容器有哪些
mysql: 我要启动的是mysql
container_name: 容器名称
image: 镜像版本
ports: 暴露的端口号
environment: 容器的配置
MYSQL_ROOT_PASSWORD: 数据库密码
MYSQL_DATABASE: 数据库名称
volumes: 数据卷,方便管理数据
mysql-data: 数据库中的数据 映射给/var/lib/mysql
/app/myconf:/etc/mysql/conf.d: 将镜像中的conf.d文件映射给/app/myconf
restart:启动时间 always=永久启动
network:加入的网络,使下边的wordpress方便调用
depends_on: 依赖关系,想要启动wordpress先启动上边的mysql
volumes:
** mysql-data:**
** wordpress:**
network:
** blog:** yml中已经向包含volumes和network的都需要在这里定义一下
Dockerfile
Dockerfile文件内容编写
1 | FROM openjdk:8 |
FROM: 运行环境
LABEL: 设置一些参数 类似于作者名称之类的
COPY:将jar爆加载到容器中
EXPORT:暴露端口 填写系统内部端口,后期在启动类上通过映射暴露
ENTRYPOINT: 运行命令
1 | docker build -f Dockerfile -t yidada:v1.0 . |
通过该命令来生成镜像 -t后边代表镜像名称
遇到的问题
docker pull 拉取镜像失败 一直报错
基本上都是镜像源出错
我原本的镜像源是阿里云镜像源
1 | sudo tee /etc/docker/daemon.json <<-'EOF' |
拉去nginx一直失败 后来修改为腾讯云镜像源后就正常了
1 | sudo tee /etc/docker/daemon.json <<-'EOF' |
启动nginx后页面访问不了
启动nginx后页面访问不了,服务器防火墙已经开放80端口还是启动不了
具体原因我也不清楚,但我知道有两个防火墙 一个是云服务商页面的防火墙 一个是服务器里面的防火墙
1 | 举个例子 开放nginx的80端口, |
然后页面就能访问了
docker挂在目录后启动报错 iptables failed: iptables –wait -t nat -A DOCKER -p tcp -d 0/0 –dport 80
很多人都说是iptables版本的问题
其实重启一下docker,重新注册链接就可以了
1 | systemctl restart docker |
docker compose up -d 命令报错 validating /root/compose.yaml: (root) Additional property service is not all
1 | validating /root/compose.yaml: (root) Additional property service is not all |
该命令是首行service引起的
docker-compose.yaml 文件应当遵循 Docker Compose 配置文件的格式。根据该错误信息,似乎文件中的 service 属性不应在根级别出现,因为 Docker Compose 的有效配置结构通常包括 version、services、networks 等顶层属性,而不包括 service。
所以修改service -> services 即可 一定要注意单词拼写以及格式啊!!!