docker官网:https://www.docker.com
docker是一种容器化技术,用来更好的构建和发布应用。
官网安装步骤:https://docs.docker.com/engine/install/centos/
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
sudo systemctl enable docker #开机自启动
sudo systemctl start docker
步骤(3),(4)可不执行。
sudo groupadd docker
sudo usermod -aG docker $USER
docker version
Client: Docker Engine - Community
Version: 20.10.12
API version: 1.41
Go version: go1.16.12
Git commit: e91ed57
Built: Mon Dec 13 11:45:41 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.12
API version: 1.41 (minimum version 1.12)
Go version: go1.16.12
Git commit: 459d0df
Built: Mon Dec 13 11:44:05 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
定义:一个镜像就代表一个软件
特点:镜像是只读的,不能进行写操作
定义:一个镜像运行一次就会生成一个容器,容器就是一个运行的软件服务。
特点:可读可写
定义:仓库存储所有软件的镜像。
定义:存储使用docker过程中的镜像
docker version
docker info
docker --help
docker images
docker pull redis
只能看是否有redis镜像,不能列出版本
docker search redis
docker image rm 镜像名
docker image rm 镜像ID
强制删除镜像
docker image rm -f 镜像
docker images tomcat
docker images -q
# docker images -q
2b213ae9dde9
f513b3f80437
6974a500c5d2
ed4f92437413
048c3fba5aec
851d23a02794
302d958928e7
13b66b487594
1b3de68a7ff8
docker image rm -f $(docker images tomcat -q)
删除所有镜像
docker image rm -f $(docker images -q)
docker ps
查看所有容器,包括停止的容器。
docker ps -a
docker run 镜像名
-p 参数可以写多个
docker run -p 8080:8080 tomcat
docker run -p 8080:8080 -d tomcat
返回容器ID
docker run -p 8082:8080 -d --name tomacat01 tomcat:8.0
docker stop 容器ID
docker start 容器ID
docker restart 容器ID
docker pause 容器ID #暂停容器
docker unpause 容器ID #恢复容器
容器暂停时,会有pause的标识
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d48d3346736b tomcat:jdk "/run.sh" 5 hours ago Up 5 hours 22/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp serene_archimedes
e480832e69e6 tomcat:jdk "/run.sh" 20 hours ago Up 4 hours 22/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp condescending_beaver
docker kill 容器ID
docker rm 容器ID #只能删除已经停止的容器,不能删除正在运行的容器
docker rm -f 容器ID #强制删除容器
强制删除所有容器
docker rm -f $(docker ps -aq)
docker logs 容器ID
docker logs --tail 10 容器ID #显示后10行日志
高频使用
docker logs -f 容器ID #显示实时的日志
docker exec -it 容器ID bash
从容器拷贝文件到宿主机
docker cp 容器ID:容器中文件或目录 宿主机目录
docker cp tomcat01:/tomcat/RUUING.txt /root
从宿主机拷贝文件到容器内
docker cp 宿主机目录 容器ID:容器中文件或目录
docker cp /root/readme.txt tomcat01:/tomcat/
docker top 容器ID
docker inspect 容器ID
作用:用来实现宿主机,与容器中数据同步
注意:数据卷使用必须在容器首次启动时设置
使用:
docker run -v 宿主机路径:容器路径:ro
docker run -d -p 8080:8080 --name tomcat02 -v /apps/:/tomcat/apps/:ro tomcat:jdk
ro:read only 如果在设置数据卷时指定ro,代表容器内路径是只读的
注意:该方式会将容器路径的原始内容全部清空,始终以宿主机路径为主<\font>
docker run -d -p 8080:8080 --name tomcat03 -v aaaa:/tomcat/apps/:ro tomcat:jdk
docker commit -m "描述信息" -a "作者信息" 容器ID 新镜像名:版本
docker commit -m "deploy project" -a "zhou" dfaae0abef47 tomcat-test:zhou
不指明路径,就保存在当前路径
docker save 镜像名:tag -o 名称.tar
docker load -i 镜像.tar
dockerhub官网:https://hub.docker.com
docker pull mysql:5.6
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql01 --restart=always -v /root/data:/var/lib/mysql mysql:5.6
问题:数据卷备份mysql容器数据时,备份的是数据库底层的文件系统。不利于数据的迁移
docker exec mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/databases.sql
docker exec mysql容器id sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/databases.sql
docker exec mysql容器id sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/databases.sql
docker pull redis:5.0.12
docker run -d -p 6379:6379 redis:5.0.12
docker run -d -p 6379:6379 --name redis01 --restart=always -v /root/redisdata:/data/ redis:5.0.12 redis-server --appendonly yes
/root/redisconf/redis.conf
docker run -d -p 6379:6379 --name redis02 --restart=always -v /data/redisocnf:/data/ redis:5.0.12 redis-server /data/redis.conf
docker pull nginx:1.19.10
docker run -d -p 80:80 --restart=always --name nginx01 nginx:1.19.10
docker run -d -p 80:80 --restart=always --name nginx02 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10
docker run -d -p 80:80 --restart=always --name nginx02 -v /root/html:/usr/share/nginx/html nginx:1.19.10
docker pull elasticsearch:6.8.10
docker run -d -p 9200:9200 -p 9300:9300 --restart=always --name es -v esdata:/usr/share/elasticsearch/data elasticsearch:6.8.10
注意:es默认使用集群方式启动,使用集群启动时会出现如下错误:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决方案如下
vm.max_map_count=262144
docker run -d -p 9200:9200 -p 9300:9300 --restart=always --name es -v esdata:/usr/share/elasticsearch/data -v /root/esconfig/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:6.8.10
容器之间通过网络进行相互通信
docker network ls
NETWORK ID NAME DRIVER SCOPE
f4592993ec2f bridge bridge local
7abdac590e2b host host local
e7525fc2fc6a mynet bridge local
f0c3788f5cda none null local
7cd2081215f8 redis bridge local
docker network create -d bridge 网络名称
docker network create clazz-web
docker network ls
docker network inspect 网络名称
docker network rm 网络名称
删除未用到的网络
docker network prune
启动容器时,明确指定使用哪个网络
docker run -d --network 网络名称 ...
docker run -d -p 8080:8080 --name tomcat01 --network clazz-web tomcat:jdk
启动容器后,再加入网络
docker network connect 网络名 容器id
示例:
默认bridge网络启动tomcat03容器
docker run -d -p 8082:8080 --name tomcat03 tomcat:jdk
将tomcat03容器加入到clazz-web网络
docker network connect clazz-web tomcat03
查看clazz-web细节
docker network inspect clazz-web
注意:自定网络既可以使用Ip地址通信,也可以使用容器名称通信
用来实现宿主机和容器之间文件目录映射、同步
注意:必须在容器首次启动时指定
docker run -v /root/datas:/usr/local/tomcat/webapps ... tomcat:8.0
docker run -v bb:/usr/local/tomcat/webapps ... tomcat:8.0
别名代表docker自身维护的数据卷
docker volume ls
DRIVER VOLUME NAME
local 37e9c89ccd44ee1bef763f50a73eeb9eb93190acdf8237b76d10ba5c622b569c
local 069dfdd4e553e7d23e18010b3584adb8775d9c52df8137447d3850a6d1651877
local 71e11f380c16c2f91b81f3a71e92f276ae0c5f7b80e870c1d0f1bb3a67781920
local 258b1f13fea3f4cca5e9575c06279e0ada720c6c7b01b5441fa262ff12d684a7
local 270e7ef1b5a966052c05114499646e8ba826acb8f12126c733fd09aa48e6ff33
local 560e5b310d4f24a4b016cde8f75df1f064dff832e85650fdf7f80ed77be7f3e2
local 7295f5e370068082cef6804958d368094027a8926e82dde20af446aaf78a1e90
local 8628ef40223a441805aaa74af7f437e153fc7694bc6e182d33f33d144fc0fdaf
local 14148f7cc07992ac5f99440d3cdc8f70c41c914e925047bc6a641cd7cd3f88f6
docker volume inspect juming
[
{
"CreatedAt": "2022-11-10T15:45:53+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/ems/_data",
"Name": "ems",
"Options": {},
"Scope": "local"
}
]
docker volume rm 数据卷
docker volume rm juming
docker volume create 数据卷别名
docker volume create ems
Dockerfile是镜像的描述文件
docker build -t mycentos:01 .
启动容器时,挂载数据卷
docker run -v datas:/apps/data mycentos:03
使用语法
(1)直接命令方式
java -jar ems.jar
(2)json数组方式
["java","-jar","ems.jar"]
CMD命令构建的容器:运行容器时再次运行命令,会直接覆盖掉dockerfile文件中的CMD指令
docker run 镜像:版本 命令
一个示例:
docker run centos:08 ls /
Entrypoint命令构建的容器,进行命令覆盖
docker run --entrypoint=覆盖指令 镜像:版本 传递的参数
一个示例:
docker run --entrypoint=ls centos:08 /
总结
FROM centos:latest
EXPOSE 8081
ENV BASE_PATH=/apps/data
WORKDIR $BASE_PATH
ADD aa.txt .
#CMD ["ls","/apps/data"]
#ENTRYPOINT ["ls","/apps/data"]
ENTRYPOINT ["ls"]
CMD ["/apps/data"]
一个jar包示例
dockerfile写法,构建ems:1.0镜像
ENTRYPOINT ["java","-jar"]
CMD ["ems.jar"]
命令行写法,运行挂载的jar包
docker run -v /root/apps:/apps ems:1.0 bb.jar
Docker compose 负责实现对docker容器的快速编排。站在项目角度将一组相关容器整合在一起,将这组容器安照指定顺序启动。
docker-compose -v
#代表docker-compose项目的版本号
version: "3.8"
services:
tomcat:
image: tomcat:8.0
ports: #宿主机与容器的端口映射
- 8080:8080
docker-compose up
version: "3.8"
services:
tomcat:
image: tomcat:8.0
ports:
- 8080:8080
tomcat01:
image: tomcat:8.0
ports:
- 8081:8080
docker-compose down可以清除docker-compose up的缓存
docker-compose down
version: "3.8"
services:
tomcat:
container_name: tomcat01 #指定容器名字,推荐使用默认容器名
image: tomcat:8.0
ports:
- 8080:8080
tomcat01:
image: tomcat:8.0
ports:
- 8081:8080
redis:
image: redis:5.0.12
ports:
- 6379:6379
mysql:
image: mysql:5.6
ports:
- 3306:3306
environment: #指定环境变量,类似于docker run -e MYSQL_ROOT_PASSWORD=root
- "MYSQL_ROOT_PASSWORD=root"
volumes: #docker-compose使用绝对路径必须先创建该路径
# - /root/mysqldata1:/var/lib/mysql
- mysqlData:/var/lib/mysql #别名方式创建数据卷,也必须先声明
volumes:
mysqlData: #声明别名数据卷
docker run -e
指令docker run --network
docker run -p
docker run -v
docker run --restart=always
version: "3.8"
service:
tomcat:
image: tomcat:8.0
ports:
- "8080:8080"
networks:
- dangdang
apps:
#build: ./ #指定dockerfile的上下文目录,一切都是默认值
build:
context: ./ #指定dockerfile的上下文目录
dockerfile: Dockerfile #指定dockerfile的文件名
ports:
- "8081:8081"
command: ["test.jar"] #覆盖容器启动后默认执行的指令
depends_on:
- tomcat #书写依赖的服务名
networks:
- dangdang
mysql
image: mysql:5.6
ports:
- "3306:3306"
#environment:
#- "MYSQL_ROOT_PASSWORD=root"
env_file:
- .env
volumes: #映射数据卷
- mysqlData:/var/lib/mysql
networks: #指定网桥
- dangdang
restart: always #容器总是运行
networks: #声明网桥。在启动的时候就会创建网桥
dangdang:
volumes: #声明别名数据卷
mysqlData:
启动整个项目的容器
docker-compose up
启动项目中的tomcat服务
docker-compose up tomcat
停止整个项目
docker-compose down
停止项目中的tomcat服务
docker-compose down tomcat
docker-compose exec tomcat bash
重启整个项目中的容器
docker-compose restart
重启项目中的tomcat容器,20秒后重启容器
docker-compose restart -t 20 tomcat
删除整个项目或者指定的服务
docker-compose rm 服务id
查看指定服务中的进程
docker-compose top tomcat
暂定某个指定的服务
docker-compose pause tomcat
暂定所有服务
docker-compose pause
恢复所有服务
docker-compose unpause
查看整个项目的日志
docker-compose logs
查看指定服务的日志
docker-compose logs tomcat
实时查看服务运行日志
docker-compose logs -f tomcat
docker pull portainer/portainer
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer