基础
安装
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| cd /etc/yum.repos.d rm -rf ./* curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo yum -y clean all yum -y makecache yum repolist
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable docker --now
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] } EOF
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ] } EOF
sudo systemctl daemon-reload sudo systemctl restart docker
|
如何获取专属镜像加速地址
阿里云 - 容器Hub服务控制台:https://cr.console.aliyun.com/
命令
以nginx起手开始学习
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| docker ps
docker ps -a
docker search nginx
docker pull nginx
docker pull nginx:1.26.0
docker images
docker rmi e784f4560448
docker run nginx
docker stop keen_blackwell
docker start 592
docker restart 592
docker stats 592
docker logs 592
docker rm 592
docker rm -f 592
docker run -d --name mynginx nginx
docker run -d --name mynginx -p 80:80 nginx
docker exec -it mynginx /bin/bash
docker commit -m "update index.html" mynginx mynginx:v1.0
docker save -o mynginx.tar mynginx:v1.0
docker rmi bde7d154a67f 94543a6c1aef e784f4560448
docker load -i mynginx.tar
docker login
docker tag mynginx:v1.0 leifengyang/mynginx:v1.0
docker push leifengyang/mynginx:v1.0
|
存储
删除容器时,目录挂载和卷映射里的文件都不会被删除
两种方式,注意区分:
目录挂载: -v /app/nghtml:/usr/share/nginx/html
卷映射:-v ngconf:/etc/nginx
注:卷映射对应的位置统一放在/var/lib/docker/volumes/<volume-name>
如此时就会放在/var/lib/docker/volumes/ngconf下
1 2 3 4 5 6 7 8 9 10 11 12
| docker run -d -p 99:80 \ -v /app/nghtml:/usr/share/nginx/html \ -v ngconf:/etc/nginx \ --name app03 \ nginx
docker volume ls
docker volume create haha
docker volume inspect ngconf
|
网络
dokcer为每个容器分配唯一ip,使用容器ip+容器端口可以互相访问
通过以下命令可以查看
1 2 3 4 5 6
| ip a
docker container inspect <container_name>
docker inspect <container_name>
|
因为ip由于各种原因可能会变化,而docker0默认不支持主机域名
1 2 3 4 5 6 7 8 9 10 11 12
| docker network create mynet
docker run -d -p 88:80 --name app1 --network mynet nginx docker run -d -p 99:80 --name app2 --network mynet nginx
docker inspect app1
docker network connect hmall mysql --alias db
|
创建自定义网络,容器名就是稳定域名
Redis主从同步集群
使用bitnami的redis镜像,这里的镜像不需要修改配置文件,只需要定义一些环境变量
bitnami的dockerhub地址
redis单服务启动命令
1
| docker run --name redis -p 6379:6379 -d -e ALLOW_EMPTY_PASSWORD=yes bitnami/redis:latest
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker network create mynet
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
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
|
启动Mysql
去官方文档寻找三大点:网络、 存储、 环境变量
因为本地就有mysql,这里暴露的端口就不选3306了
1 2 3 4 5
| docker run -d -p 3306:3306 \ -v /app/myconf:/etc/mysql/conf.d \ -v /app/mydata:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql
|
启动PostgreSql
1
| docker run -d \ -p 5432:5432 \ -v /mydata/postgres/pgdata:/var/lib/postgresql/data \ -e POSTGRES_PASSWORD=wqeq \ --name pgsql \ postgres
|
PostgreSQL 默认只监听 localhost
,无法接受外部连接。
解决办法:
修改 PostgreSQL 配置文件(容器中一般路径是 /var/lib/postgresql/data/postgresql.conf
)
修改 pg_hba.conf
文件,添加允许外部访问的规则:
1
| host all all 0.0.0.0/0 md5
|
重启 PostgreSQL 容器:
1
| docker restart <container_id>
|
Docker Compose
批量管理容器的工具
博客实践
命令式安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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 8090: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
|
compose.yaml安装
官方参考文档
其实就是参考docker run时候的参数,再在参考文档里面去找对应的语法,对应如图
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
| 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 - /app/myconf:/etc/mysql/conf.d restart: always networks: - blog
wordpress: image: wordpress ports: - "8099: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
| docker compose -f compose.yaml up -d
|
“1”代表这个容器启动了一个
特性
增量更新
- 修改 Docker Compose 文件。重新启动应用。只会触发修改项的重新启动。
数据不删
- 默认就算down了容器,所有挂载的卷不会被移除。比较安全
1 2 3 4 5 6 7 8 9 10 11
| docker compose -f compose.yaml
docker compose -f compose.yaml down
docker compose -f compose.yaml down --rmi all -v
docker compose -f compose.yaml -p myapp up -d
|
Dockerfile
常见指令 |
作用 |
FROM |
|
RUN |
|
CMD |
|
LABEL |
|
EXPOSE |
|
ENV |
|
ADD |
|
COPY |
|
ENTRYPOINT |
|
VOLUME |
|
USER |
|
WORKDIR |
|
ARG |
|
官方参考文档
1 2 3 4 5 6 7 8 9
| FROM openjdk:17
LABEL author=lcdzzz
COPY app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
|
构建镜像
1 2
| docker build -f Dockerfile -t myjavaapp:v1.0 .
|
Docker分层机制
1 2 3 4
| docker image history [image_name]
docker image inspect nginx
|
镜像和(多个)容器的关系如下,容器是在镜像基础之上的可读可写层,所以容器删除以后,这一层的东西也是不保存的。而镜像的基础数据还存在磁盘里。
总结