docker入门详解
简述
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker对软件跨环境迁移问题提供了一个很好的解决方案。
安装docker
笔者使用的是windows系统,因为docker是部署在linux的,所以我们要在window配置虚拟机,详细安装教程:
https://www.runoob.com/docker/windows-docker-install.html
安装完可以在命令行使用docker run hello-world命令检测是否运行成功,在成功运行之后应该会出现以下信息:
docker架构
docker包含三个基本概念:
镜像:Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统
容器:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
仓库:仓库可看成一个代码控制中心,用来保存镜像。
docker的镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器
在 Registrymirrors 一栏中填写自己的加速器地址即可(可以去阿里云自己配置)
docker常用命令
docker run [options] <image name>|<id> [command] | 运行命令 |
docker ps | 查看当前运行的容器 |
docker ps -a | 查看所有容器 |
docker rm 容器id | 删除容器 |
docker images | 查看镜像 |
docker run 镜像名 | 将命令封装到镜像中 |
docker logs <container name> | 查看容器的日志 |
docker start <container name> | 启动容器 |
tldr docker | 查看docker常用的几个命令 |
docker run的常用options有
-d | 后台运行,指日志信息不输出在当前控制台 |
--name | 为容器起名 |
docker持久化
当容器关闭的时候,数据也就清空了,这时就需要持久化的操作
提供独立于容器之外的持久化存储,有两种方式:Bind Mounting和Data Volume
Bind Mounting和虚拟机的共享文件夹类似,就是将本地目录和虚拟目录进行一个映射的操作
具体使用方法为run命令后跟着 -v 参数,然后指定两个文件的映射
docker run -d --restart=always --name mysqltest -p 3310:3306 \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf:/etc/mysql \
-v /home/mysql/log:/var/log/mysql
例如此处对三个目录进行了挂载
docker容器镜像的清理
使用docker system的相关命令可以查看docker的全局信息
查看docker应用的全局信息:容器、镜像的状态,给docker分配的资源
docker system info
查看空间使用情况
docker system df
删除所有退出状态的容器
docker container prune
删除未使用的数据卷
docker volume prune
删除所有未被使用的镜像
docker image prune
docker file
docker的最大用处就是构建自己的docker镜像,然后部署
在项目里可以直接手动创建Dockerfile文件,没有后缀,名字也是固定的
# 使用JDK8环境作为基础镜像 FROM java:8 # 拷贝JRA包 COPY build/libs/生成的jar包名 app.jar # 容器启动时执行 ENTRYPOINT ["java","-jar","/app.jar"] # 暴露端口 EXPOSE 8080
然后使用build命令就能生成该应用的镜像
docker build -t 镜像名:tag名
推送镜像到docker hub
当想让自己的镜像部署在别的机器上的时候,我们就可以和git操作一样推送自己的镜像至远端仓库
首先我们可以对镜像进行重标记,目的是加上id名,保证镜像在docker hub的唯一性
docker tag 镜像名:tag 个人id/镜像名:tag
然后我们就能将本地镜像推送到docker hub了
docker login # 登录docker hub docker push id/镜像名:tag # 推送镜像 docker logout #登出docker hub
docker compose文件
对于多容器组成的项目,容器之间想要互相调用,就需要docker-compose的帮助了
对于一系列想执行的命令,我们可以把命令都写在docker-compose.yml文件里
然后使用 docker-compose up 和 docker-compose down 完成整个application的启和停
version: '3'
services:
alice: #容器名
build: alice #容器内DockerFile的目录
image: alice:1.0 #镜像名及版本号
container_name: alice #运行的容器名
ports:
- '8088:8080' #端口映射
depends_on: #容器之间的依赖,指定bob代表alice会在bob之后启动
- bob
bob:
build: bob
image: bob:1.0
container_name: bob
ports:
- '8081:8081'
这里的alice和bob都是项目的模块,每个模块都有DockerFile
配置项的build内容就是指定模块中DockerFile的目录
如果项目想要用到外部容器,例如mysql,可以在docker-compose中增加配置项
version: '3'
services:
mysql:
restart: always
image: mysql:5.7.18
container_name: mysql-lable
volumes:
- /apps/mysql/mydir:/mydir
- /apps/mysql/datadir:/var/lib/mysql
- /apps/mysql/conf/my.cnf:/etc/my.cnf
# 数据库还原目录 可将需要还原的sql文件放在这里
- /apps/mysql/source:/docker-entrypoint-initdb.d
environment:
- "MYSQL_ROOT_PASSWORD=yourpassword" #mysql的密码
- "MYSQL_DATABASE=yourdbname" #mysq的用户名
- "TZ=Asia/Shanghai" #时区
ports:
# 使用宿主机的3306端口映射到容器的3306端口
# 宿主机:容器
- 3306:3306