Docker简介
Docker是一个基于Go语言编写的用于软件或程序环境迁移的利器,解决了程序开发中开发环境、测试环境以及运行环境版本不一导致测试异常的尴尬窘境,为开发人员提供了更加方便快捷的解决方案;
Docker可以理解为一个巨大的容器,而我们的各个需要的技术栈的软件都可以随时随地从Docker上下载,但是Docker中引用的并不是直接的我们需要的环境的对象,而是类似Spring工厂,Docker中的大量的不同技术栈软件的文件称为镜像,即类似Java中的类文件,而当我们需要这个软件时,拉取镜像的同时,Docker会为我们创建对应的软件容器,也可以理解成创建了镜像的对象,这样也更好理解;
Docker架构
Docker安装
1.卸载旧版docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2.安装docker依赖
# 安装基本依赖库
yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken
# 更新XFS文件系统管理工具
yum update xfsprogs -y
3.安装docker
# 更新本地镜像源
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 更新镜像源缓存
sed -i 's/download.docker.com/mirrors.ustc.edu.cn\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 更新镜像源缓存
yum makecache fast
# 安装Docker
yum install -y docker-ce
4.启动docker服务
# 查看防火墙状态
systemctl status firewalld
# 关闭本地防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 启动docker服务
systemctl start docker
# 设置开机自启动
systemctl enable docker
5.配置镜像加速
Docker官方镜像仓库网速较差,我们需要设置国内镜像:
参考阿里云的镜像加速文档:阿里云镜像管理地址(https://www.aliyun.com/)
# 创建配置文件
mkdir -p /etc/docker
# 配置镜像加速地址 (填写自己阿里云下的镜像加速地址)
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://91oqc1nv.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置并重启Docker
systemctl daemon-reload
systemctl restart docker
Docker相关命令
镜像操作
相关命令
操作Docker镜像的常用命令有:
docker --help : 查询帮助
docker xxx --help : 查询xxx命令的作用和使用方式★★★★★
docker search 镜像名称 : 在镜像仓库搜索镜像
docker pull 镜像名称:tag : 从镜像仓库拉取镜像
docker push : 将本地镜像推送到远程镜像库
docker images : 查看本地镜像列表
docker rmi 镜像名称:tag : 删除本地镜像
docker save -o xxx.tar 镜像名1 镜像名2 : 保存镜像为一个tar文件
docker load -i xxx.tar : 加载本地tar文件中包含的镜像
docker build : 构建一个镜像(我们自己制作镜像)
docker tag 镜像名:tag 新镜像名:tag : 给镜像打新标签(重命名)
容器操作
将一个镜像运行起来,就可以得到镜像对应的容器.
相关命令
操作Docker容器的常用命令有:
docker run --name 容器名称 -p 80:80 -d 镜像名称 : 创建并运行容器
--name 容器名称
-p 端口映射
-d 后台运行
docker stop 容器名称 :停止容器
docker start 容器名称:启动容器
docker ps :查看运行中的容器
docker ps -a : 查看所有容器
docker rm 容器名称:删除容器
docker rm -f 容器名称 : 强制删除容器(无论运行与否)
docker exec :执行容器内的指定指令
docker commit :提交一个容器为镜像
数据卷
概述
为什么需要数据卷
操作数据卷命令
数据卷是一个虚拟的概念,一个数据卷指向宿主机上的一个文件夹:
每创建一个数据卷就会在/var/lib/docker/volumes目录下新建一个对应的文件夹
#创建数据卷
docker volume create 数据卷名称
#查询数据卷信息
docker volume inspect 数据卷名称
#查询所有数据卷基本信息
docker volume ls
#删除未使用的数据卷
docker volume prune
#删除数据卷
docker volume rm 数据卷名称
#挂载数据卷 (建立数据卷与容器目录的对应关系)
docker run \
--name mn \
-v html:/usr/share/nginx/html \
-p 8080:80 \
-d \
nginx
# 说明:
# docker run :就是创建并运行容器
# --name mn :给容器起个名字叫mn
# -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
# -p 8080:80 :把宿主机的8080端口映射到容器内的80端口
# nginx :镜像名称
网络管理
当我们要部署基于docker的微服务群时,往往会需要容器之间互相连接。这时就需要用到Docker中的网络配置了
集群: 多台服务器做相同的事情
分布式: 多台服务器做不同的事情,在共同协作下完成一个具体的业务
#创建一个名为my-net的网络(名称可以自定义)
docker network create my-net
#将指定容器加入到my-net网络
docker network connet my-net 容器名称
#将一个容器退出指定的网络
docker network disconnect 网络名称 容器名称
#查看网络的详细信息,如IP网段等
docker network inspect 网络名称
#列出所有的网络
docker network ls
#删除所有未使用的网络
docker network prune
#删除所有指定的网络
docker network rm 网络名
常用镜像
安装mysql
==========================
# 关闭或禁用Linux上已经安装的mysql,因为端口被占用了
# 关闭
systemctl stop [mysql/mysqld]
# 禁用
systemctl disable [mysql/mysqld]
===========================
#1.拉取或从本地加载MySQL镜像。因为镜像文件较大,推荐从本地加载
docker pull mysql:5.6
#2.创建两个数据卷mysql-data、mysql-conf
docker volume create mysql-data
docker volume create mysql-conf
#3.进入mysql-conf数据卷所在目录,新建一个my.cnf文件
# 查看数据卷对应目录
docker volume inspect mysql-conf
# 进入
cd /var/lib/docker/volumes/mysql-conf/_data
# 创建核心配置文件 my.cnf(Linux环境下mysql的核心配置文件)
touch my.cnf
#4.编辑my.cnf文件,设置mysql编码等配置属性
--------------
# mysql配置文件内容:
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
---------------
#5.创建并运行容器。【具体参数及挂载目录参考DockerHub网站的说明】
docker run \
--name mysql \
-p 3306:3306 \
-d \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql-data:/var/lib/mysql \
-v mysql-conf:/etc/mysql/conf.d \
--privileged \
mysql:5.6
DockerFile自定义镜像
dockerFile概述
回顾之前镜像原理的章节,我们可以了解到,镜像的本质是一层层的Layer。基于一个rootfs这个基础的Layer定制每一层所添加的配置、文件,要执行的操作等。
如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么这个脚本就是 Dockerfile。
因此,Dockerfile就是一个描述镜像构建的文件。其中一定会有一个基础镜像(BaseImage),然后在基础镜像上每完成一次修改或安装命令,就形成一层新的Layer,直到镜像构建完成。
常用命令(参考)
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
EXPOSE port1 prot2 | 用来指定端口,使容器内的应用可以通过端口和外界交互 |
CMD argument | 在构建容器时使用,会被docker run 后的argument覆盖 |
ENTRYPOINT argument | 入口点,容器启动后会执行的命令,比如启动mysql。效果和CMD相似,但是并不会被docker run指定的参数覆盖 |
VOLUME | 将本地文件夹或者其他容器的文件挂载到容器中 |
Docker镜像服务
之前当我们需要使用镜像时都是从阿里云上或DockerHub上下载.
也可以自己通过Dockerfile做镜像.
我们能不能将我们自己做的镜像上传到阿里云或DockerHub?
能
镜像服务地址: https://cr.console.aliyun.com/
1.找到个人实例
2.创建命名空间(阿里云域名/你的命名空间)
3.设置登录的密码阿里云镜像服务
私有镜像仓库
# 安装镜像仓库镜像
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
# 镜像仓库默认会自动启动,如何查看镜像仓库中有哪些镜像呢?
访问: http://你的宿主机地址:5000/v2/_catalog
# 配置允许指定ip向本地镜像仓库提交镜像
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容: json格式,需要加 逗号
"insecure-registries":["http://宿主机ip地址:5000"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
# 推送
docker push 宿主机ip地址:5000/nginx:1.0
# 拉取
docker pull 宿主机ip地址:5000/nginx:1.0
# 镜像若想存放到本地镜像仓库,需满足本地仓库的格式
格式: docker tag nginx:latest 宿主机ip地址:5000/nginx:1.0