@zhangyy
2020-09-21T01:20:17.000000Z
字数 11551
阅读 385
docker的部分
一:Docker概述
二:Docker安装
三:镜像管理
四:容器管理
五:管理应用程序数据
六:容器网络
七:Dockerfile
八:企业级镜像仓库Harbor
1. 使用最广泛的开源容器引擎2. 一种操作系统级的虚拟化技术3. 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)4. 一个简单的应用程序打包工具
1. 提供简单的应用程序打包工具2. 开发人员和运维人员职责逻辑分离3. 多环境保持一致性

1. Docker Client:客户端2. Ddocker Daemon:守护进程3. Docker Images:镜像4. Docker Container:容器5. Docker Registry:镜像仓库



1. 应用程序打包和发布2. 应用程序隔离3. 持续集成4. 部署微服务5. 快速搭建测试环境6. 提供PaaS产品(平台即服务)
1. 社区版(Community Edition,CE)2. 企业版(Enterprise Edition,EE)
1. Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)2. Mac3. Windows

提供的官方网址官方文档:https://docs.docker.com# 安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker软件包源yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装Docker CEyum install -y docker-ce# 启动Docker服务并设置开机启动systemctl start dockersystemctl enable docker



镜像是什么?1. 一个分层存储的文件2. 一个软件的环境3. 一个镜像可以创建N个容器4. 一种标准化的交付5. 一个不包含Linux内核而又精简的Linux操作系统镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\<storage-driver\>中。
镜像从哪里来?Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。地址:https://hub.docker.com/explore配置镜像加速器:https://www.daocloud.io/mirrorcurl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

如下图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。


docker info列出当前的docker 的版本

去这里 下载:https://download.openvz.org/template/precreated/cat centos-6-x86_64-minimal.tar.gz |docker import - centos:6.0 ## 创建镜像cat centos-7-x86_64-minimal.tar.gz |docker import - centos:7.0cat ubuntu-16.04-x86_64.tar.gz |docker import - ubuntu:16.04另一个种方法:docker pull nginx:1.15docker history nignx:1.15这个分层的下载的

创建一个容器:docker run -itd --name nginx-test -p 8080:80 nignx:1.15docker ps -l进入一个容器docker exec -ti 1e9515c8c966 /bin/bash


docker commit 1e9515c8c966 nginx-test:v1 提交容器到本地仓库

docker image nginx-test:v1 > nginx-test.tar 导出一个镜像

docker image rm nginx-test:v1 删掉一个镜像

docker load -i nginx-test.tar 导入一个镜像

docker tag nginx-test:v1 node04.flyfish/nginx/myapp:v1 给镜像打个标签方便提交到私有仓库docker images


进入一个容器:docker pull httpddocker run -tid --name httpd-test -p 4040:80 httpddocker ps -l

进入这个容器docker ps -ldocker exec -ti a30f616852a1 /bin/bash


docker run -tid --name centos7-test centos:7.0:v1 /bin/bashdocker ps -a



docker run -tid --name nginx1-test1 -p 6060:80 --restart always nginx:1.15开机自启动 容器 (默认是docker 启动 容器是不启动的)


docker run -tid --name nginx2-test2 -p 7070:80 -e flyfish=zhangyy -h nginx-web --restart always nginx:1.15指定 容器的 hostname 名称 与 制定 环境变量 并设置开机自启动

查看日志docker logs 8ea2c0ae169a -f



示例:内存限额:允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:docker run -d --name nginx03 --memory 500m --memory-swap 600M --oom-kill-disable nginx:1.15docker stats f50b08998e87


CPU限额:允许容器最多使用一个半的CPU:docker run -d --name nginx04 --cpus="1.5" nginx:1.15docker stats 79b51c9d4eee


允许容器最多使用50%的CPU:docker run -d --name nginx05 --cpus=".5" nginx:1.15docker stats e70a483d0519



查看容器docker container lsdocker ps -a

进入容器执行命令:docker exec -ti e70a483d0519 /bin/bashdocker exec e70a483d0519 ls

提交容器:docker commit e70a483d0519 nginx05:v1docker images

文件拷贝到容器中docker cp nginx-test.tar e70a483d0519:/docker exec e70a483d0519 ls

docker logs -f 8ea2c0ae169a

查看容器的映射对外端口:docker port 8ea2c0ae169a

查看当前容器运行的主进程docker top 8ea2c0ae169a
查看容器的是使用的资源docker stats 8ea2c0ae169a --no-stream

删除容器:docker rm e70a483d0519

Docker提供三种方式将数据从宿主机挂载到容器中:• volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。• bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。• tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

管理卷:# docker volume create nginx-vol# docker volume ls# docker volume inspect nginx-vol用卷创建一个容器:# docker run -d --name=nginx3-test3 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx:1.15# docker run -d --name=nginx3-test3 -v nginx-vol:/usr/share/nginx/html nginx1.15清理:# docker stop nginx3-test3# docker rm nginx3-test3# docker volume rm nginx-vol注意:1. 如果没有指定卷,自动创建。2. 建议使用--mount,更通用。






用卷创建一个容器:# docker run -d -it --name=nginx4-test4 --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx:1.15# docker run -d -it --name=nginx4-test4 -v /app/wwwroot:/usr/share/nginx/html nginx:1.15验证绑定:# docker inspect nginx4-test4清理:# docker stop nginx4-test4# docker rm nginx4-test4注意:1. 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。2. 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。




Volume特点:• 多个运行容器之间共享数据。• 当容器停止或被移除时,该卷依然存在。• 多个容器可以同时挂载相同的卷。• 当明确删除卷时,卷才会被删除。• 将容器的数据存储在远程主机或其他存储上• 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)---Bind Mounts特点:• 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。• 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。• 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
• bridge–net=bridge默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥


• host–net=host容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
docker run -tid --net=host busyboxdocker exec -ti 59a38da6c947 sh与 宿主机共享一个网络

• none–net=none获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。

• container–net=container:Name/ID与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
docker run -tid --net=container:nginx04 busyboxdocker exec -ti 4d141b2cb971 /bin/bashdocker inspect 79b51c9d4eee和nginx04 公用一个IP地址



• 自定义网络与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
docker network create test-ntdocker run -ti --net=test-nt --name bs11 busybox在开一个终端:docker run -ti --net=test-nt --name bs12 busybox





vim test.yaml---FROM centos7.0:v1MAINTAINER flyfishRUN yum install gcc -yCOPY run.sh /usr/binEXPOSE 80CMD [“run.sh”]---

Build镜像----Usage: docker build [OPTIONS] PATH | URL | - [flags]Options:-t, --tag list # 镜像名称-f, --file string # 指定Dockerfile文件位置# docker build .# docker build -t shykes/myapp .# docker build -t shykes/myapp -f /path/Dockerfile /path# docker build -t shykes/myapp http://www.example.com/Dockerfile
示例:touch index.htmlecho 11111 > index.htmlvim Dockerfile---FROM centos7.0:v1MAINTAINER flyfishRUN yum install -y httpdCOPY index.html /var/www/htmlENV HTTP_V=2.0EXPOSE 80WORKDIR /tmpCMD ["httpd","-D","FOREGROUND"]---docker build -t httpd:v1 -f Dockerfile .docker images




构建一个nginx 镜像:mkdir nginxcd nginxvim Docker-nginx----FROM centos:7MAINTAINER flyfishRUN yum install -y gcc gcc-c++ make \openssl-devel pcre-devel gd-devel \iproute net-tools telnet wget curl && \yum clean all && \rm -rf /var/cache/yum/*RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \tar zxf nginx-1.15.5.tar.gz && \cd nginx-1.15.5 && \./configure --prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_stub_status_module && \make -j 4 && make install && \rm -rf /usr/local/nginx/html/* && \echo "ok" >> /usr/local/nginx/html/status.html && \cd / && rm -rf nginx-1.15.5* && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeENV PATH $PATH:/usr/local/nginx/sbin#COPY nginx.conf /usr/local/nginx/conf/nginx.confWORKDIR /usr/local/nginxEXPOSE 80CMD ["nginx", "-g", "daemon off;"]----docker build -t nginx:v1 -f Dockerfile .docker images


测试:docker run -tid --name nginx1.15-test1 nginx:v1 /bin/bash



构建一个php的镜像mkdir phpmv Dockerfile-php php-fpm.conf php.ini php---FROM centos:7MAINTAINER flyfishRUN yum install epel-release -y && \yum install -y gcc gcc-c++ make gd-devel libxml2-devel \libcurl-devel libjpeg-devel libpng-devel openssl-devel \libmcrypt-devel libxslt-devel libtidy-devel autoconf \iproute net-tools telnet wget curl && \yum clean all && \rm -rf /var/cache/yum/*RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \tar zxf php-5.6.36.tar.gz && \cd php-5.6.36 && \./configure --prefix=/usr/local/php \--with-config-file-path=/usr/local/php/etc \--enable-fpm --enable-opcache \--with-mysql --with-mysqli --with-pdo-mysql \--with-openssl --with-zlib --with-curl --with-gd \--with-jpeg-dir --with-png-dir --with-freetype-dir \--enable-mbstring --with-mcrypt --enable-hash && \make -j 4 && make install && \cp php.ini-production /usr/local/php/etc/php.ini && \cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \mkdir /usr/local/php/log && \cd / && rm -rf php* && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeENV PATH $PATH:/usr/local/php/sbinCOPY php.ini /usr/local/php/etc/COPY php-fpm.conf /usr/local/php/etc/WORKDIR /usr/local/phpEXPOSE 9000CMD ["php-fpm"]----docker build -t php:v1 -f Dockerfile .docker images |grep php



1、自定义网络docker network create lnmp2、创建Mysql容器docker run -d \--name lnmp_mysql \--net lnmp \--mount src=mysql-vol,dst=/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf83、创建PHP容器docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v14、创建Nginx容器docker run -d --name lnmp_nginx --net lnmp -p 88:80 \--mount src=wwwroot,dst=/wwwroot nginx:v15、以wordpress博客为例https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz




cd /var/lib/docker/volume/wwwroot/_data/vim test.php---<?php phpinfo();?>---

wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gztar -zxvf wordpress-4.9.4-zh_CN.tar.gz

http://ip:88/wordpress/






FROM centos:7MAINTAINER flyfishENV VERSION=8.5.54RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \yum clean all && \rm -rf /var/cache/yum/*RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \#RUN wget http://192.168.31.211/apache-tomcat-${VERSION}.tar.gz && \tar zxf apache-tomcat-${VERSION}.tar.gz && \mv apache-tomcat-${VERSION} /usr/local/tomcat && \rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \mkdir /usr/local/tomcat/webapps/test && \echo "ok" > /usr/local/tomcat/webapps/test/status.html && \sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeENV PATH $PATH:/usr/local/tomcat/binWORKDIR /usr/local/tomcatEXPOSE 8080CMD ["catalina.sh", "run"]


基于镜像 tomcat:v1 镜像 构建一个jenkins 部署 镜像vim Dockerfile-jenkis---FROM tomcat:v1COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war---docker build -t tomcat-jenkins:v1 -f Dockerfile-jenkins .

使用tomcat-jenkins:v1 构建一个jenkins的项目docker run -tid --name jenkins-test -p 8080:8080 --restart always -h jenkins tomcat-jenkins:v1



密码:docker exec -ti e0edd5f81092 cat /root/.jenkins/secrets/initialAdminPassword---67f0ce7c72dd4fca83f8f6d047fb46de---下面安装就可以了

Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。官方地址:https://vmware.github.io/harbor/cn/

• 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小• 离线安装:安装包包含部署的相关镜像,因此安装包比较大• OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor
在node06.flyfish 主机上面部署首先要安装docker然后 安装 安装docker-composesudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose


# tar zxvf harbor-offline-installer-v1.5.1.tgz# cd harbor# vi harbor.cfghostname = 192.168.100.16ui_url_protocol = httpharbor_admin_password = 12345# ./prepare# ./install.sh








默认用户名:admin密码: 12345

创建用户 flyfish密码:Flyfish123

libary 添加成员 flyfish


# vi /etc/docker/daemon.json{"insecure-registries":["192.168.100.16"]}# systemctl restart docker


登录镜像仓库:docker login http://192.168.100.16用户名:flyfish密码:Flyfish123

为镜像打一个tag默认镜像的提交模式是:docker tag SOURCE_IMAGE[:TAG] 192.168.100.16/library/IMAGE[:TAG]提交模式:docker push 192.168.100.16/library/IMAGE[:TAG]----将tomcat:v1 nginx:v1 php:v1 tomcat-jenkins:v1 的 镜像提交到仓库中:docker tag tomcat:v1 192.168.100.16/library/tomcat:v1docker tag nginx:v1 192.168.100.16/library/nginx:v1docker tag php:v1 192.168.100.16/library/php:v1docker tag tomcat-jenkins:v1 192.168.100.16/library/tomcat-jenkins:v1-----上传镜像docker push 192.168.100.16/library/tomcat:v1docker push 192.168.100.16/library/nginx:v1docker push 192.168.100.16/library/php:v1docker push 192.168.100.16/library/tomcat-jenkins:v1




