文章目录
Docker入门
简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
安装
Centos 7安装Docker
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
配置镜像源
vi /etc/docker/deamon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://registry.aliyuncs.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
Docker组成
一个完整的Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器
相关命令
# 启动docker
systemctl start docker
systemctl restart docker
systemctl stop docker
# 查看docker运行状态
systemctl status docker
# 设置开机启动
systemctl enable docker
操作镜像
# 查看镜像
docker images
# 搜索镜像
docker search xxx
# 拉取镜像
docker pull iamgesName:Version
# 删除镜像
docker rmi
容器操作
# 创建容器
docker run --name ContainerName -i
# 删除
docker rm
docker start
docker stop
docker ps -a
# 查看容器信息
docker inspect
-i 以交互模式运行容器
-d 以守护模式运行容器
-t 为容器重新分配一个伪输入终端
-it 交互式容器
-id 守护式容器
数据卷
数据卷是宿主机中的一个目录或文件(将容器目录映射到宿主机中)
当容器目录和数据卷目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器绑定
数据卷的作用
- 容器数据持久化
- 客户端和容器数据交换
- 容器间的数据交换
docker run ... -v 宿主机:容器
## 继承其他容器的数据卷
docker run ... --volume-from ...
Docker部署
安装MySQL
docker pull mysql:5.7
docker run -id -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
安装Redis
docker pull redis:5.0
docker run -id -p 6379:6379 redis:5.0
Docker镜像原理
- Docker镜像是由特殊的文件系统叠加而成的
- 最低端是bootfs,并且使用宿主机的bootfs
- 第二层是root文件系统rootfs,称为Base Image
- 然后再往上可叠加其他的镜像文件
分层文件系统
docker inspect redis
镜像制作
- 容器转换为镜像
docker commit 容器ID 镜像名称:版本号
# 将镜像转换为压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
# 将压缩文件转换为镜像
docker load -i 压缩文件名称
- 通过DockerFile制作镜像
DockerFile是一个文件,包含了一条条的指令
基于基础镜像,每一条指令构件一层,最终构建出一个新的镜像
制作案例
FROM centos:7
MAINTAINER name<email>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
然后构建
docker build -f DockerFile路径 -t 镜像名称:版本号 .
- Docker在运行时分为Docker引擎(服务端守护进程) 以及客户端工具。
- 使用Docker 命令,其实就是在使用客户端工具与 Docker引擎进行交互。
- Docker Build命令构建过程其实是在Docker引擎中完成的,而不是在本机环境。
- 所以Docker Build最后的 .号,其实是在指定镜像构建过程中的上下文环境的目录。
那么如果在DockerFile中使用了一些COPY等指令来操作文件,如何让Docker引擎获取到这些文件呢?这里就有了一个镜像构建上下文的概念,当构建的时候,由用户指定构建镜像的上下文路径,而Docker Build会将这个路径下所有的文件都打包上传给Docker引擎,引擎内将这些内容展开后,就能获取到所有指定上下文中的文件了。
定义DockerFile发布Springboot项目
准备springboot-xxx.jar
编写DockerFile文件
FROM java:8
MAINTAINER xxx<xxx>
ADD springboot-xxx.jar app.jar
CMD java -jar app.jar
构建
docker build -f ./xxx -t app .
服务编排
按照一定的业务规则批量管理容器
Docker Compose:一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括微服务构建、启动和停止。使用步骤:
- 利用DockerFile定义运行环境镜像
- 利用
docker-compose.yml
定义组成应用的各服务 - 运行
docker-compose up
启动应用
docker-compose安装
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- version:指定 docker-compose.yml 文件的写法格式
- image:指定服务所使用的镜像
- expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
- links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
使用docker compose部署nginx + springboot项目
创建docker-compose.yml
文件
version: '3'
services:
nginx:
image: nginx
port:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:etc/nginx/conf.d
app:
image: app
export:
- "8080"
创建conf.d
文件
mkdir -p ./nginx/conf.d
cd ./nginx/conf.d
vim nginx.conf
nginx.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
docker-compose up
-d 以守护模式运行容器
Docker私有仓库
docker pull registry
docker run -id --name=registry -p 5000:5000 registry
# 访问 ip:5000/v2/_catalog
vim /etc/docker/deamon.json
+ "insecure-registries": ["ip:5000"]
systemctl restart docker
# 上传镜像
docker tag centos:7 ip:5000/centos:7
docker push ip:5000/centos:7
# 拉取镜像
docker pull ip:5000/centos:7
容器虚拟化和传统虚拟化比较