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
来源:https://www.cnblogs.com/xvchengqi/p/10241184.html