文章目录
- Docker安装
- Docker的基础使用
- 搜索&拉取镜像
- Docker的生命周期
- 利用Docker切换不同OS
- Docker容器
- 镜像的保存&分享
- Docker存储
- Docker网络
Docker安装
- 更新apt索引
sudo apt-get update
- 添加Docker所需要的依赖
apt-get install ca-certificates curl gnupg lsb-release
- 添加Docker的GPG秘钥,这里我添加的是Tsinghua的
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg |apt-key add -
- 添加Docker的软件源到apt中并且更新
sudo add-apt-repository "deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
- 安装Docker
apt-get install docker-ce docker-ce-cli containerd.io
- 修改Daemon添加仓库源
vim /etc/docker/daemon.json
添加如下:
{"registry-mirrors": ["https://dockerproxy.com","https://docker.m.daocloud.io","https://cr.console.aliyun.com","https://ccr.ccs.tencentyun.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://github.com/ustclug/mirrorrequest","https://registry.docker-cn.com"]
}
- 载入Daemon并且启动Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
- 测试是否可以使用
sudo docker run hello-world
- 配置用户组,让其余用户也可以使用
sudo usermod -aG docker username
newgrp docker
Docker的基础使用
搜索&拉取镜像
通过docker search 镜像名可以直接搜索可以匹配到的相关镜像:
docker search nginx
找到之后就可以把镜像下载下载,使用docker pull命令即可:
docker pull nginx
此时可以通过docker image ls查看当前所拥有的所有镜像。
docker image ls
通过ls可以查看到镜像的具体ID,通过ID可以移除镜像:
docker rmi ID
Docker的生命周期
如上图所示
- 首先Dockerfile用户构建一个Image,然后这个Image和容器之间可以通过run和commit进行运行和提交。
- Images可以添加tag管理版本,容器自身可以通过各种操作管理状态。
- 最后就是Images与备份和Docker仓库之间的拉取和上传操作。
利用Docker切换不同OS
Docker的本质上是通过构建不同的容器来隔离环境,从而做到在一个操作系统上运行多种需求的技术。这里Docker的每个容器并不是一个OS,不具备一个OS所需要的所有部件。因此Docker比虚拟机要节省资源。
举例来说,Docker可以在一个Linux服务器上部署多种发行版。在实际操作中并不是把这些发行版全部下载了,只是下载了其软件包的部分,他们共用宿主主机的内核。因此大大节省了资源开销。
举个例子:拉取Centos和ubuntu镜像
docker pull centos:7.8.9.2003
通过-it以交互式进入到镜像中并且开启一个新的terminal
docker run -it your_centos_id bash
其中bash指定了我们使用bash作为shell,进入后通过cat /etc/redhat-release就可以查看当前系统,已经备切换到了centos中
cat /etc/redhat-release
通过exit就可以退出容器环境。从这里也可以了解到了Docker的原理,本质上类似于Python的虚拟环境这样的技术,而不是虚拟操作系统。
Docker容器
接下来开始使用Docker的容器,以Nginx为例子。
首先,通过docker run指令就可以启动一个容器
docker run -d -p 80:80 nginx
其中80:80指的是从容器内的80端口映射到容器外宿主机的80端口是-p的参数,-d是后台运行。后面可以使用nginx这个名称直接指定镜像也可以使用期内部的镜像ID制定。
docker run还有如下的参数:
- –rm: 容器停止后自动删除容器
- -it: 交互式运行容器,分配一个伪终端
- –env 或 -e: 设置环境变量
- –restart: 容器的重启策略
- –name: 给容器指定一个名称
使用上述的指令后nginx就运行在了docker容器并且在后台运行。通过ps指令可以查看当前的状态:
docker ps
这个时候通过80端口就可以访问到nginx了。如果此时你想要进入到Docker的容器的后台查看具体的情况,也就是从后台切到前台,可以使用exec指令:
docker exec -it c15692f358e6 bash
此时你就可以进入到这个正在运行的容器内部进行操作。exec还有很多其他的参数,主要用于给正在运行的容器执行一个新的命令,全部的表述为:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数有:
- -d, --detach: 在后台运行命令。
- -e, --env: 设置环境变量。
- –env-file: 从文件中读取环境变量。
- -i, --interactive: 保持标准输入打开。
- –privileged: 给这个命令额外的权限。
- –user, -u: 以指定用户的身份运行命令。
- -t, --tty: 分配一个伪终端。
这里涉及到Docker Image的原理,如图所示,一个Docker的Image是包含了很多的层,其中包含了可以写入的部分和不可写的部分。从下到上依次是各式各样的依赖,最后一层是可写层,也就是我们进入后台后所到的位置。在这里我们可以进行一些操作,也叫容器层。
Docker这样对镜像进行分层有很多好处,例如可以多个容器共享同一个底层镜像。节省资源,而需要进行修改时,Docker又会自动的对其进行复制。
所有的容器的修改都只发生在容器层,所有的底层Image都不会被修改或者删除,更像是软删除,软修改这样的操作。
随后介绍docker剩下的所有容器指令:
docker stop用于停止一个镜像
docker stop c15692f358e6
此时就停止了原本的nginx所在的容器,此时使用docker ps是看不到任何的容器的,但是并不意味着容器被销毁了,其实没有的。使用docker ps -a即可查看所有的容器:
docker ps -a
返现原本的nginx还是有的,只不过是处于exited状态。如果你想恢复容器使用,那么就是用docker start指令:
docker start c15692f358e6
同理你还可以使用restart指令进行重启,效果类似于stop + start。
如果当然,容器运行时会发生很多的错误,你可以使用docker logs来进行查看日志debug
docker logs c15692f358e6
最后如果你不想要一个容器,你可以通过rm指令直接删除:
docker rm c15692f358e6
类似Linux的rm你可以通过添加-f强制删除即使是在运行的容器
docker rm -f c15692f358e6
镜像的保存&分享
docker允许我们把自己本地的容器内的镜像进行打包,然后发送给其他人。类似于git。我们可以使用commit,save和load来完成这些工作。
首先,使用docker commit命令可以把镜像进行打包:
docker commit -a Zipper -m "Test Image" -p c15692f358e6 mynginx:v1.0
其中各个参数如下:
- -a 指定作者
- -m 详细信息
- -p 在commit时暂停运行镜像
其中,保存的最后的两个参数为 容器名 镜像名称,此时就生成了一个Mynginx:v1.0镜像。此时你使用 docker image ls指令就可以发现多了一个mynginx包
随后可以使用save指令把镜像打包为一个tar包
docker save -o mynginx.tar Mynginx:v1.0
类似的,你可以使用load指令把一个镜像压缩包导入到docker中
docker load -i ./mynginx.tar
Docker存储
Docker内的许多数据修改起来十分的困难,因为这些容器内可能连vim这类的基础命令都不存在。假如我们希望容器内能对外部的数据进行读取和写入,此时我们又不可能把数据全部迁移容器内,此时就会很麻烦。
所以,我们必须要能在外部的宿主系统上对一些容器内的数据进行修改操作,以方便我们在外部进行一些操作。于是Docker提供了目录挂载功能,方便我们把宿主机的容器挂载到容器中,让容器对其进行操作。
我们可以在docker启动的时候添加一个-v参数,使其把宿主机目录挂载到容器目录内
docker run -d -p 80:80 -v /app/html:/usr/share/nginx/html nginx
如上所示,我们就完成了一个挂载。
有时在初始化一个容器时,容器内的某个目录下有一些东西这些外部的宿主机目录是没有的,如果强行挂载会导致挂载失败容器直接无法启动。这是因为容器外的挂挂载目录缺少这些初始配置,而容器启动又依赖于这些初始配置。
所以此时我们就需要使用卷映射,他会在初始化时在宿主机的固定一个目录下初始化一个卷,把docker容器内的内容复制过来并且建立映射。卷映射使用-v,但是不再以/作为开头,而是只有一个卷名
docker run -d -p 80:80 -v nginxvol:/usr/share/nginx/ nginx
此时你就会在/var/lib/docker/volumes下找到一个叫做nginxvol,这个就是映射的内容。
Docker网络
有时候,我们可能部署多个容器,容器内的服务可能需要互相通信(例如前端和后端),这就需要配置容器之间的网络。docker每启动一个容器都会为容器分配一个唯一的ip,我们可以使用这个ip直接跨容器通信。
使用ifconfig即可查看:
ifconfig
但是直接使用ip会导致访问出现问题,例如在迁移时可能会导致ip变化。最保险的做法是通过域名来访问。我们可以使用docker network来创建docker网络
docker network create mynet
而在容器启动时可以使用docker run添加–network参数来选择我们使用的网络。当多个容器加入到同一个网络时,他们就可以互相的通信访问,直接使用容器名替代原本的ip进行访问。