DocKer

"一天学习Docker"

Posted by HZY on January 21, 2026

Docker 入门

  • Client
  • Docker Host
  • Registry

    安装Docker

  • 按照手册安装就好了
1
sudo systemctl start docker #知道docker服务的名字就是docker就够了,systemctl 谁不会用呢

Docker基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker search nginx 
docker pull nginx  #默认下载lastest
docker images  # 查看容器
docker search nginx:版本  #推荐自己去找镜像版本Tag
docker rmi ngnix:版本
docker rmi [IMAGE_ID]


docker run nginx
docker ps  #查看正在运行的容器
docker ps -a #查看所有容器,停止的也能查看
docker stop
docker start 
docker restart 
docker stats
docker logs
docker rm #必须先stop才能rm
docker rm -f #强制删除,注意区别rm和rmi

Docker Run 细节

docker run -d --name mynginx nginx之后竟然无法通过80端口访问nginx默认页,这是由于一个docker相当于一个小型linux,所以我们只算是部署到了docker的80端口

1
2
3
4
5
6
7
docker run -d --name mynginx -p 80:80 nginx
#-d表示后台启动,-p表示主机映射
#这样就可以访问到了哎!!!
docker exec -it docker_name /bin/bash   #进入容器
#容器为了保持小体积,甚至连vi都没有
# 这样有点麻烦,所以以后会学文件映射
exit #退出容器

保存镜像,分享社区

1
2
3
4
5
6
7
8
9
docker commit -m "update" 容器名称 镜像名字
docker save -o my.tar 镜像 #-o打包tar包
docker load -i my.tar 

docker login
docker tag myweb:v1.0 haiziyao/myweb:v1.0
docker push haiziyao/myweb #一定要有用户名

@ 记得制作一个latest版本

Docker 存储

容器中的资源都只是存在内存中,容器会消失,所以我们选择用named volume来持久化

但是对于一些原有的配置文件,只需要微调修改,所以只需要进行bind mount,容器删除后也不会消失

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker rm -f $(docker ps -aq)

docker run -d -p 80:80 -v /app/nginxhtml:/usr/share/nginx/html  --name app nginx
# 挂载之后原来的默认内容都会消失
# 我们exec进去看到的还是挂载的目录

docker run -d -p 80:80 -v /app/nginxhtml:/usr/share/nginx/html  -v ngconf:/etc/nginx --name app nginx
#named volume 和 bind mount的区别就在于要不要以./为开头
# /var/lib/docker/volumes/<volumes-name>

docker volume ls 
docker volume create
docker volume inspect ngconf 

Docker网络

外部通信麻烦,docker有机制可以内部通信172.17.0.1网关

1
2
3
4
5
6
7
8
9
10
docker container inspect 容器 
curl http://172.17.0.2:80 #就这样就可以访问到了
# 但是如果容器上下线导致ip更改就g了

#Docker允许自定义网络,用域名访问
#Docker的默认网络docker0不支持域名访问
docker network create mynet
docker run -d -p 80:80 -v /app/nginxhtml:/usr/share/nginx/html  -v ngconf:/etc/nginx --name app --network mynet nginx

curl http://app:80

Redis主从集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker run -d -p 6379:6379 \
-v  /app/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis01 bitnami/redis

cd /app
chmod -R 777 rd1

docker run -d -p  6380:6379 \
-v /app/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \
-e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis02 bitnami/redis

cd /app
chmod -R 777 rd2

WordPress

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
docker compose up -d 
docker compose down 
docker compose start x1 x2 x3 
docker compose stop x1 
docker compose scale x2=3 #启动3份


docker network create blog

docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
-v /app/myconf:/etc/mysql/conf.d \
--restart always --name mysql \
--network blog \
mysql:8.0

docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress:/var/www/html \
--restart always --name wordpress-app \
--network blog \
wordpress:latest

Docker Compose

  • name
  • service
  • networks
  • volumes
  • configs
  • secrets
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
name: myblog
services:
    mysql:
        container_name: mysql
        image: mysql:8.0
        ports:
            - "3306:3306"
        environment:
            - MYSQL_ROOT_PASSWORD=123456 
            - MYSQL_DATABASE=wordpress 
        volumes:
            - mysql-data:/var/lib/mysql  #对于named volume的,一定要在顶级volumes中再定义一下
            - /app/myconf:/etc/mysql/conf.d
        restart: always
        networks:
            - blog
        
    wordpress:
        container_name: wordpress
        image: wordpress:latest
        ports:
            - "8080:80"
        environment:
            WORDPRESS_DB_HOST: mysql #这个有两种写法
            WORDPRESS_DB_USER: root
            WORDPRESS_DB_PASSWORD: "123456"
            WORDPRESS_DB_NAME: wordpress
        volumes:
            - wordpress:/var/www/html
        restart: always
        networks:
            - blog
        depends_on:
            - mysql

volumes:
    mysql-data: 
    wordpress:
networks:
    blog:
1
2
3
4
5
6
7
docker rm -f $(docker ps -aq)
docker volume rm mysql-data wordpress
docker network rm blog

docker compose -f compose.yaml up -d
docker compose -f compose.yaml down  #移除网络,容器,不移除卷
docker compose -f compose.yaml down --rmi -v #移除镜像和卷

DockerFile

Dockerfile

1
2
3
4
5
6
7
8
9
FROM openjdk:17

LABEL author = hzy

COPY app.jar /app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]

docker build -f Dockerfile -t myjavaapp:v1.0

镜像分层存储机制