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
镜像分层存储机制