Docker
Docker 的优点
- 提供简单轻量的建模方式
- 职责的逻辑分离
- 快速高效的生命周期
- 鼓励使用面向服务的架构
Docker 的组成
Docker C/S结构
Docker是C/S(客户端client-服务器server)架构模式。
docker通过客户端连接守护进程,通过命令向守护进程发出请求,守护进程通过一系列的操作返回结果。
docker客户端可以连接本地或者远程的守护进程。Docker Image镜像
镜像是容器的基石,容器基于镜像启动和运行。镜像就好像容器的源代码,保存了容器各种启动的条件。镜像是一个层叠的只读文件系统。
Docker container容器
容器通过镜像来启动,容器是docker的执行来源,可以执行一个或多个进程。镜像相当于构建和打包阶段,容器相当于启动和执行阶段。容器启动时,Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台。
要注意的是,由于容器是基于镜像的,所以不管对容器怎样的操作,一旦容器重启,一切都会变成最开始的样子。
Docker registry 仓库
docker仓库用来保存镜像。docker仓库分为公有和私有。docker公司提供公有仓库docker hub,网址:https://hub.docker.com/。我们也可以创建自己私有的仓库。
一、安装
# 1.配置源
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 2.下载docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
# 3.启动docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
# 优化镜像的安装
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
}
EOF
二、镜像
1.基本使用
# 1.获取镜像
# 查询远程仓库中的centos
docker search centos
# 下载镜像(服务、系统)
docker pull centos:6.9
docker pull centos:7.5.1804
docker pull nginx
# 2.查询镜像
# 查询拥有的镜像
docker images
# 显示所拥有的镜像的ID
docker images -q
# 通过镜像ID或者镜像名加标签查询镜像,并显示详细信息
docker inspect ID/name:tag
# 3.删除镜像
# 根据ID删除镜像
docker rmi ID
# 查询所有镜像ID并删除
docker rmi `docker images -q`
docker rmi $(docker images -q)
# 4.导入导出镜像
# 导出
docker image save nginx >/opt/nginx.tar.gz
# 导入
docker image load -i /opt/nginx.tar.gz
# 5.启动容器并获取镜像
docker run -d -p 80:80 httpd
docker run -it --name "test" centos:6.9
# -d: 后台运行容器,并返回容器ID;
# -p: 端口映射,格式为:主机(宿主)端口:容器端口;
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# --name="nginx-lb": 为容器指定一个名称;
# httpd/centos6.9:可以根据镜像名或镜像ID来启动镜像
2.制作镜像
语法
docker commit xxxxxx oldguo/wordpress:v1
# xxxxxx:拥有的镜像名/镜像ID
# oldguo/wordpress:制作的镜像名
# v1:制作的镜像标签
# 为何要制作镜像
# 比如我对centos7.5添加了一些软件,然后不想每次都启动原始的centos7.5,都要再添加一次软件,所以,可以把添加软件后的centos7.5制作成一个镜像,然后启动这个镜像就行
制作镜像: centos7.5+vim+net-tools+iproute+sshd
# 1.启动新容器
docker run -it --name "centos7.5" 76d6bc25b8a5
# 2.优化yum源
mv /etc/yum.repos.d/*.repo /tmpecho -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
# 3. 安装必须软件包
yum install -y vim net-tools iproute openssh-* -y
# 4.启动SSHD
mkdir /var/run/sshd
echo 'UseDNS no' >> /etc/ssh/sshd_config
sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
echo 'root:123456' | chpasswd
# 分配公钥
/usr/bin/ssh-keygen -A
/usr/sbin/sshd -D
# 注意: 以上操作做完之后,会一直不退出,需要用以下命令退回到宿主机,并不关闭容器 ctrl+p+q
# 5.制作镜像,以便日后使用
docker commit centos7.5 oldguo/centos7_sshd:v2
3.dockerfile
# dockerfile 可以快速创建一个镜像
# 我们就使用dockerfile来快速创建一个centos7.5+vim+net-tools+iproute+sshd的镜像
# 1.创建一个dockerfile文件
vim dockerfile
# 2.输入内容
FROM centos:7.5.1804
RUN mv /etc/yum.repos.d/*.repo /tmp
RUN echo -e "[ftp]\nname=ftp\nbaseurl=ftp://10.0.0.100/pub/centos7\ngpgcheck=0">/etc/yum.repos.d/ftp.repo
RUN yum install -y openssh-server
RUN yum install -y openssh-clients
RUN yum install net-tools* -y
RUN yum install iproute-* -y
RUN mkdir /var/run/sshd
RUN echo 'UseDNS no' >> /etc/ssh/sshd_config
RUN sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
RUN echo 'root:123456' | chpasswd
RUN /usr/bin/ssh-keygen -A
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
# 3.执行dockerfile文件
docker build -t "oldguo/centos7_sshd:v3" /opt/dockerfile
# docker build 命令用于使用 Dockerfile 创建镜像。
# 使用时要指定dockerfile文件所在的目录,若不指定,就会从当前目录里找
三、容器
1.容器的类型
按用途容器大致可以分为两类:服务类容器和工具类容器
# 1. 服务类容器以daemon的形式运行,对外提供服务。比如web server,数据库等。通过-d参数以守护方式启动这类容器非常合适。如果需要排查问题,可以通过exec -it进入容器
# 工具类:vim
docker run -it --name="test_vim" 3fe2fe0dab2e /bin/bash
# 2. 工具类容器通常给我们提供一个临时的工作环境,通常以run -it方式运行
# 服务类:nginx
# -d:后台运行
docker run -d -p 8080:80 --name="discuz" nginx:1.14
2.容器的多类启动方式
①启动进入容器指定bash 退出后容器关闭
docker run -it --name "test" centos:7.5.1804 /bin/bash
# 1.使用-it+/bin/bash执行后,会在容器后台启动一个bash进程,显示该容器的终端
# /bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出
# 2.使用/bin/bash启动镜像的时候如果没有带参数 -it的话,容器会直接退出
# 3.使用-it执行后,容器重新分配一个伪输入终端,容器不会立即退出,直到exit容器才关闭
# 注:
# 针对于工具类的容器,由于是一次性使用的,一旦exit容器,容器就自动关闭。
# 对于想要退出后还可以在后台执行的,比如服务类,可以使用Ctrl+p+q。
②docker attach进入容器
# 如果容器没有指定bash环境会停留在空白页面 退出后容器也会正常退出(进入容器后其他人进入容器可以看到你输入的信息
docker attach test
# attach进入的容器应当是已经启动的容器,当有多台主机通过attach进入同一台容器时,所有的操作都是多台主机同时可见的,当退出时也是同时退出
# 也可以理解为,attach是对一台容器开了多个终端操作,当其中一台终端操作时,会反映到所有的终端上
③docker exec 进入容器 会启用一个bash环境
# exec也是进入一个已经开启的容器中,但是会新启用一个bash环境,不会像attach一样同步到每个终端
docker exec -it test /bin/bash
3.容器的常用管理命令
# 查看容器
# -a:显示所有的容器,包括未运行的。
# -q:只显示容器编号
# -l:显示最近创建的容器。
docker ps -a -q -l
# 查看容器中运行的进程信息
docker top nginx
# 删除一个或多少容器
# -f:通过SIGKILL信号强制删除一个运行中的容器
# -l:移除容器间的网络连接,而非容器本身
# -v:删除与容器关联的卷
docker rm 容器ID|容器名称
# 批量删除已关闭
docker rm -v $(docker ps -aq -f status=exited)
# 批量强制删除所有
docker rm -f `docker ps -a –q`
# 获取容器/镜像的元数据,包括IP等
docker inspect nginx
# 连接到正在运行中的容器。
docker attach 容器ID|容器名称(工具类)配合ctrl+p+q
docker exec -i -t 容器ID|容器名称 /bin/bash(服务类),一般是做服务类容器调试用
# 停止一个运行中的容器
docker stop 容器ID|容器名称
# 杀掉一个运行中的容器。
docker kill 容器ID|容器名称
# 启动一个或多个已经被停止的容器
docker start 容器ID|容器名称
# 重启容器
docker restart 容器ID|容器名称
四、数据卷(持久化)
在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。 容器中数据管理主要有两种方式:
数据卷和数据卷容器
- 数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
- 数据卷容器(Data Volume Containers) 使用特定容器维护数据卷
1.使用
# 启动时指定:
docker run -it --name="centosv1" -v /opt/datavolumns:/data centos /bin/bash
# Dockerfile中指定
VOLUMES [“/data”]
docker inspect centosv1
2.数据卷数据的备份及恢复
# 备份
docker run --volumes-from centosv1 --name “centosvbak“ --rm -v /backup:/backup:rw centos tar cvf /backup/data.tar /data
# 恢复
docker run --volumes-from centosv1 --name "centosrestore" --rm -v /backup:/backup:rw centos tar xvf /backup/data.tar
五、仓库
1.配置私有仓库
# 1.
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/Registry:/var/lib/registry registry
# 2.配置
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.100:5000"]
}
# 3.重启docker
systemctl restart docker
2.使用本地镜像
# 配置好私有仓库,我们就可以把制作好的镜像放到本地的私有仓库,方便下载使用
# 1.制作本地镜像并push到私有仓库
# 为本地镜像nginx打上标签
# IP地址加上私有仓库的端口号(10.0.0.100:5000/)是必须的,后面的名字就随意了
docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1
docker push 10.0.0.100:5000/oldguo/nginx:v1
# 2.异地进行pull镜像,从本地的私有仓库下载镜像
docker pull 10.0.0.100:5000/oldguo/nginx:v1