1. 什么是docker

docker简单来说就是加速、构建、分享、运行我们的应用
方便应用下载、运行应用 例如WeGame游戏客户端,可以直接在WeGame上下载自己想玩的游戏,也可以直接在WeGame启动自己想玩的游戏

2. docker如何工作

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
2
3
4
5
6
7
sudo tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://mirror.ccs.tencentyun.com/"]
> }
>
> EOF

5. docker下的nginx目录挂载

1
2
3
docker run -d --name mynginx -p 80:80 -v /limuye/nginx/html:/usr/share/nginx/html nginx
# -v自己的目录:目标目录(也就是nginx目录中对应的文件夹)

docker compose

docker compose中yml文件的写法

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
name: myblog
service:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: XXXXX
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
- /app/myconf:/etc/mysql/conf.d
restart: always
network:
- blog

wordpress:
container_name: wordpress
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: XXXXXX
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
restart: always
network:
- blog
depends_on:
- mysql


volumes:
mysql-data:
wordpress:
network:
blog:

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
2
3
4
5
6
7
8
9
FROM openjdk:8

LABLE author=limuye

COPY yidada-backend-0.0.1-SNAPSHOT.jar /yidada-backend-0.0.1-SNAPSHOT.jar

EXPOSE 8101

ENTRYPOINT ["java" , "-jar" , "yidada-backend-0.0.1-SNAPSHOT.jar"]

FROM: 运行环境
LABEL: 设置一些参数 类似于作者名称之类的
COPY:将jar爆加载到容器中
EXPORT:暴露端口 填写系统内部端口,后期在启动类上通过映射暴露
ENTRYPOINT: 运行命令

1
docker build -f Dockerfile -t yidada:v1.0 .

通过该命令来生成镜像 -t后边代表镜像名称

遇到的问题

docker pull 拉取镜像失败 一直报错

基本上都是镜像源出错
我原本的镜像源是阿里云镜像源

1
2
3
4
5
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://780urbjd.mirror.aliyuncs.com"]
}
EOF

拉去nginx一直失败 后来修改为腾讯云镜像源后就正常了

1
2
3
4
5
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com/"]
}
EOF

启动nginx后页面访问不了

启动nginx后页面访问不了,服务器防火墙已经开放80端口还是启动不了
具体原因我也不清楚,但我知道有两个防火墙 一个是云服务商页面的防火墙 一个是服务器里面的防火墙

1
2
3
4
举个例子 开放nginx的80端口,
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)

firewall-cmd --reload (重新加载)

然后页面就能访问了

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 即可 一定要注意单词拼写以及格式啊!!!