Docker C/S结构python
Docker是C/S(客户端client-服务器server)架构模式。
docker经过客户端链接守护进程,经过命令向守护进程发出请求,守护进程经过一系列的操做返回结果。
docker客户端能够链接本地或者远程的守护进程。linux
Docker Image镜像nginx
镜像是容器的基石,容器基于镜像启动和运行。镜像就好像容器的源代码,保存了容器各类启动的条件。镜像是一个层叠的只读文件系统。web
Docker container容器docker
容器经过镜像来启动,容器是docker的执行来源,能够执行一个或多个进程。镜像至关于构建和打包阶段,容器至关于启动和执行阶段。容器启动时,Docker容器能够运行、开始、中止、移动和删除。每个Docker容器都是独立和安全的应用平台。数据库
要注意的是,因为容器是基于镜像的,因此无论对容器怎样的操做,一旦容器重启,一切都会变成最开始的样子。json
Docker registry 仓库vim
docker仓库用来保存镜像。docker仓库分为公有和私有。docker公司提供公有仓库docker hub,网址:https://hub.docker.com/。咱们也能够建立本身私有的仓库。centos
# 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.获取镜像 # 查询远程仓库中的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来启动镜像
docker commit xxxxxx oldguo/wordpress:v1 # xxxxxx:拥有的镜像名/镜像ID # oldguo/wordpress:制做的镜像名 # v1:制做的镜像标签 # 为什么要制做镜像 # 好比我对centos7.5添加了一些软件,而后不想每次都启动原始的centos7.5,都要再添加一次软件,因此,能够把添加软件后的centos7.5制做成一个镜像,而后启动这个镜像就行
# 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
# 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. 服务类容器以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
①启动进入容器指定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
# 查看容器 # -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容器的数据操做。 容器中数据管理主要有两种方式:
数据卷和数据卷容器
# 启动时指定: docker run -it --name="centosv1" -v /opt/datavolumns:/data centos /bin/bash # Dockerfile中指定 VOLUMES [“/data”] docker inspect centosv1
# 备份 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. 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
# 配置好私有仓库,咱们就能够把制做好的镜像放到本地的私有仓库,方便下载使用 # 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