用docker部署应用
镜像
- 虚拟机的一组静态磁盘文件
- 可以任意下载、复制、分发
- hub.docker.com
- 镜像名称,由两部分组成
- Repository:Tag
- 名称:标签
- 如果不写标签,默认标签是
latest
- 镜像的常用命令
# 下载镜像
docker pull 镜像名称
# 镜像列表
docker images
# 为镜像添加新的名称
docker tag redis my-redis:v1
docker tag redis redis-tedu:v2
# 删除镜像的名称
# 删除最后一个名称时,会把镜像磁盘文件一起删除
# remove image
docker rmi my-redis:v1
docker images
# 导出镜像到压缩文件
docker save rabbitmq:management benwang6/cerebro:0.9.4 | gzip > a.gz
# 从压缩文件导入,加载镜像
# 先删除
docker rmi rabbitmq:management benwang6/cerebro:0.9.4
# 再导入
docker load -i a.gz
常用容器命令:
# 启动容器
docker run mariadb
# 在前台启动,占用命令行
docker run redis
# 查看容器
docker ps # 运行状态的容器
docker ps -a # all
# 查看镜像中设置的默认启动命令
docker history redis
docker history mariadb
docker history rabbitmq:management
# 覆盖 CMD 设置的默认命令
docker run redis pwd
docker run redis ls -a -l
# -i 交互 -t 终端
docker run -it redis bash
exit
docker ps -a
镜像中设置默认启动命令:
- CMD
```shell
CMD ["redis-server"]
# "java -jar /opt/cs/cs.jar"
CMD ["java", "-jar", "/opt/cs/cs.jar"]
- ENTRYPOINT
# "java -jar /opt/cs/cs.jar"
ENTRYPOINT ["java"]
CMD ["-jar", "/opt/cs/cs.jar"]
# 覆盖ENTRYPOINT
docker run --entrypoint ls redis -a -l
-d 后台运行
docker run -d \
redis
docker ps
docker logs 容器ID前3位
进入容器,执行容器中的命令
docker exec -it cbc pwd
docker exec -it cbc touch a.txt
docker exec -it cbc ls -a -l
docker exec -it cbc bash
exit
docker ps
容器命名
docker run -d --name r1 \
redis
docker run -d --name r2 \
redis
docker ps
docker logs r1
docker stop r1 r2
docker start r1 r2
–restart=always 让容器可以随系统自动重启
服务器重启,或docker系统服务重启,容器默认是退出状态
docker run -d --name r3 \
--restart=always \
redis
docker ps
# 重启docker系统服务
systemctl restart docker
docker ps
–rm 容器关闭时,会被系统自动删除
启动临时容器
- 查看容器中的一些默认设置
- 从容器复制文件到宿主机
# redis容器启动后,容器内有哪些环境变量
docker run --rm redis env
docker cp 在容器和宿主机之间互相复制文件
# 从容器复制文件到宿主机
docker cp r3:/data/dump.rdb ~/
ls
# 从宿主机复制文件到容器
docker cp ~/ip-static r3:/data/ip
# 进入容器查看文件
docker exec -it r3 ls /data/
数据挂载:文件、文件夹、数据卷
# 启动mariadb数据库,挂载宿主机的一个文件夹存放数据文件
# -v挂载会自动创建宿主机目录
docker run -d --name mysql \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mariadb
# 挂载文件
docker run -d --name r4 \
-v /root/redis.conf:/my.conf \
redis \
redis-server /my.conf
docker rm r1 r2 r3
docker rm -f r1 r2 r3
# 清理所有停止的容器
docker container prune
docker container prune -f
# 删除所有容器
# docker ps -aq 列出所有容器的id
docker rm -f $(docker ps -aq)
# 挂载文件夹
# 组主机的文件夹会自动创建
docker run -d --name r1 \
-v /opt/my-app/:/opt/app \
redis
# 访问容器内的路径,创建文件,实际是创建到宿主机挂载的目录下
docker exec -it r1 touch /opt/app/a.txt
# 查看宿主机文件
ls /opt/my-app/
数据卷挂载
# 清理容器
docker rm -f $(docker ps -aq)
# 新建数据卷
docker volume create my-vol
# 查看数据卷列表
docker volume ls
# 查看数据卷详情
docker inspect my-vol
# 启动数据库容器,挂载my-vol数据卷
docker run -d --name mysql \
-v my-vol:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mariadb
# 查看容器的挂载详情
docker inspect mysql
# 启动新的容器,my-vol挂载到容器
docker run -d --name r1 \
-v my-vol:/opt/app/ \
redis
docker exec -it r1 touch /opt/app/a.txt
# ls 数据卷的真实路径
ls /var/lib/docker/volumes/my-vol/_data