├── 1. Docker入门基础 ├── Containers_Vs_VMs.png ├── Docker_Achitecture.png ├── ReadMe.md ├── helloworld.png └── version.png ├── 2. Docker数据卷与数据卷容器 ├── DataVolume.png ├── DataVolumeContainer.png ├── ReadMe.md ├── change.png ├── test.png └── test_.png ├── 3. Docker部署私有仓库 ├── ReadMe.md ├── config.png ├── pull.png ├── server.png └── 官方部署Registry.png ├── 4. Docker私有仓库使用域名和限制登录 ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── ReadMe.md └── key.png ├── 5. Dockerfile使用总结 ├── ReadMe.md └── docker.jpg ├── 6. 使用docker-compose实现容器编排 ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png └── ReadMe.md ├── Docker and Vagrant.pdf ├── ReadMe.md └── pdf ├── 1. Docker入门基础.pdf ├── 2. Docker数据卷与数据卷容器.pdf ├── 3. Docker部署私有仓库.pdf ├── 4. Docker私有仓库使用域名和限制登录.pdf ├── 5. Dockerfile使用总结.pdf └── 6. 使用docker-compose实现容器编排.pdf /1. Docker入门基础/Containers_Vs_VMs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/1. Docker入门基础/Containers_Vs_VMs.png -------------------------------------------------------------------------------- /1. Docker入门基础/Docker_Achitecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/1. Docker入门基础/Docker_Achitecture.png -------------------------------------------------------------------------------- /1. Docker入门基础/ReadMe.md: -------------------------------------------------------------------------------- 1 | ``` 2 | Docker入门基础 3 | Author:LiNing 4 | ``` 5 | 6 | ### Docker 介绍: 7 | 8 | **[Docker](https://github.com/docker/docker)**是能够把应用程序自动部署到容器的开源引擎,而**容器**是一种依托于Linux内核的虚拟化技术,也就是说,如果我们想要一种**“隔离”**的环境来进行开发,那就用Docker吧。 9 | 10 | 一说到虚拟化,很自然会联想到虚拟机,比如我们常用的VMWare。我们可以在宿主机上再安装一个操作系统,Windows、Linux等。这样在安装好的操作系统内进行任何操作,都不会影响到外面的宿主机也就是我们本机电脑的环境。这样的好处在于,我们可以方便地去进行不同系统的学习以及模拟多台机器的交互。 11 | 12 | 与虚拟机不同,Docker不需要我们在宿主机上重新安装一个操作系统,它依赖于宿主机环境,这样大大节省了程序部署及运行所需要的空间和时间。而Docker容器内的操作,也完全影响不到宿主机,更不会影响到其他容器。 13 | 14 | ![](Containers_Vs_VMs.png) 15 | 16 | Docker主要由几部分组成:**客户端**,**服务端**,**远程仓库**。Docker采用了C/S架构,用户通过在本地客户端,访问远程服务端的守护进程,从而操纵容器。 17 | 18 | 容器是通过镜像来创建的,而镜像保存在仓库中。需要注意的是,容器类似于会话,只不过它的操作仅仅限于容器内部,而镜像类似于操作系统,我们可以通过操作系统创建多个会话,类似的,**通过一个镜像可以创建多个容器**。 19 | 20 | ![](Docker_Achitecture.png) 21 | 22 | 对于Ubuntu Linux操作系统,Docker要求是**64位**操作系统,如Ubuntu Trusty 14.04 (LTS),并且内核发行号最低要求3.10。 23 | 在安装前需要检查内核发型号:**uname -a** 24 | 25 | ### Docker 安装: 26 | 27 | 安装方式有两种。 28 | 29 | * 安装Ubuntu维护的版本(推荐): 30 | 31 | 1.更新apt数据源: 32 | 33 | sudo apt-get update 34 | sudo apt-get install apt-transport-https ca-certificates 35 | sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D 36 | echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list 37 | sudo apt-get update 38 | sudo apt-get purge lxc-docker 39 | sudo apt-cache policy docker-engine 40 | 41 | 2.安装Docker: 42 | 43 | sudo apt-get update 44 | sudo apt-get install docker-engine 45 | 46 | * 安装Docker维护的版本: 47 | 48 | sudo apt-get update 49 | sudo apt-get install curl 50 | curl -fsSL https://get.docker.com/ | sh 51 | 52 | 53 | ### Docker 运行: 54 | 55 | 安装完Docker后,我们需要在系统上启动Docker服务:sudo service docker start 56 | 57 | 这样,我们就可以运行Docker了。 58 | 59 | 比如,查看Docker版本: 60 | 61 | docker version 62 | 63 | ![](version.png) 64 | 65 | 运行hello-world镜像: 66 | 67 | docker run hello-world 68 | 69 | 这里,Docker会首先检查本地是否存在hello-world镜像,如果没有,则从Docker Hub上拉取,再运行 70 | 71 | ![](helloworld.png) 72 | 73 | 关于Docker命令,有很多,直接输入**docker help**可以查看,讲的很清楚。一起来体验Docker吧~ 74 | -------------------------------------------------------------------------------- /1. Docker入门基础/helloworld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/1. Docker入门基础/helloworld.png -------------------------------------------------------------------------------- /1. Docker入门基础/version.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/1. Docker入门基础/version.png -------------------------------------------------------------------------------- /2. Docker数据卷与数据卷容器/DataVolume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/2. Docker数据卷与数据卷容器/DataVolume.png -------------------------------------------------------------------------------- /2. Docker数据卷与数据卷容器/DataVolumeContainer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/2. Docker数据卷与数据卷容器/DataVolumeContainer.png -------------------------------------------------------------------------------- /2. Docker数据卷与数据卷容器/ReadMe.md: -------------------------------------------------------------------------------- 1 | ``` 2 | Docker数据卷与数据容器 3 | Author:LiNing 4 | ``` 5 | 6 | #### 为什么要用数据卷 7 | 8 | 在Docker容器运行期间,对文件系统的所有修改都会以增量的方式反映在容器使用的联合文件系统中,并不是真正的对只读层数据信息修改。每次运行容器对它的修改,只能适用于当前Docker容器,当删除该容器,或通过该镜像重新启动时,之前的更改将会丢失。这样做并不便于我们持久化和共享数据,而Docker的数据卷可以解决这个问题。 9 | 10 | 数据卷是经过特殊设计的目录,可以绕过容器使用的联合文件系统(Union File System),为一个或多个容器提供访问。数据卷本质上对应的是宿主机的文件目录。 11 | 12 | ![image](DataVolume.png) 13 | 14 | 数据卷设计的目的在于数据的持久化和共享数据,它完全独立于容器的生存周期。因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理。 15 | 16 | #### 容器与宿主机之间的数据共享 17 | 18 | 建立一个名为ubuntu_volume的交互式容器,并挂载主机目录~/data_host1,对应容器目录/datavolume1,同时挂载主机目录~/data_host2,对应容器目录/datavolume2。当然使用DockerFile构建包含数据卷的容器也是可以的。这样,我们不论在主机目录~/data_host中做修改,还是在容器目录/datavolume中做修改,都会彼此同步。 19 | 20 | docker run -it --name ubuntu_volume -v ~/data_host1:/datavolume1 -v ~/data_host2:/datavolume2 ubuntu /bin/bash 21 | cd datavolume1 22 | mkdir test 23 | 24 | ![image](test.png) 25 | 26 | 这样,在容器的目录/datavolume1中创建了test目录,可以反映到宿主机的~/data_host1中。 27 | 28 | 我们可以查看该容器,或者查看容器挂载的数据卷。 29 | 30 | docker inspect ubuntu_volume 31 | docker volume ls 32 | 33 | 如果要删除容器挂载的数据卷,有两种办法:一种就是删除容器的同时删除其挂载的数据卷,如**docker rm -v ubuntu_volume**;另外一种办法,就是查看容器中未被挂载的数据卷,记录其ID,再用**docker volume rm**命令删除。 34 | 35 | #### 容器与容器之间的数据共享 36 | 37 | 有的时候,我们并不想指定挂载的宿主机的目录,或者说,我们只想实现容器与容器之间的数据共享,这就需要用到数据卷容器。顾名思义,数据卷容器就是挂载着数据卷的容器,其他容器通过挂载这个容器来实现数据共享。 38 | 39 | ![image](DataVolumeContainer.png) 40 | 41 | 比如,挂载之前创建的ubuntu_volume容器: 42 | 43 | docker run -it --name ubuntu_volume_ --volumes-from ubuntu_volume ubuntu /bin/bash 44 | cd datavolume1 45 | mkdir test_ 46 | 47 | ![image](test_.png) 48 | 49 | 这样,在新建的名为ubuntu\_volume\_的交互式容器下,挂载了容器ubuntu_volume。 50 | 51 | 同样,我们可以在容器ubuntu\_volume\_的datavolume1中创建test_目录,这样的更改不仅可以反映到容器ubuntu_volume的datavolume1中,还能反映到ubuntu_volume挂载的宿主机目录~/data_host1中。 52 | 53 | 查看容器ubuntu_volume的datavolume1目录和宿主机目录~/data_host1: 54 | 55 | ![image](change.png) 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /2. Docker数据卷与数据卷容器/change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/2. Docker数据卷与数据卷容器/change.png -------------------------------------------------------------------------------- /2. Docker数据卷与数据卷容器/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/2. Docker数据卷与数据卷容器/test.png -------------------------------------------------------------------------------- /2. Docker数据卷与数据卷容器/test_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/2. Docker数据卷与数据卷容器/test_.png -------------------------------------------------------------------------------- /3. Docker部署私有仓库/ReadMe.md: -------------------------------------------------------------------------------- 1 | ``` 2 | Docker部署私有仓库 3 | Author:LiNing 4 | ``` 5 | 6 | Docker镜像能够以tar包的形式导出和导入,实现程序部署环境的迁移,也能够像github、bitbucket等版本仓库那样将镜像推送到Docker远程仓库上。 7 | 8 | Docker仓库分为**公有仓库**和**私有仓库**,官方有个仓库叫**[Docker Hub](https://hub.docker.com/)**可以供Docker开发者实现镜像的推送和拉取,也支持公有仓库和私有仓库。但是网络问题,如果从官方仓库拉取镜像速度会很慢,而且有些涉及到重要项目的镜像推送到人家服务器上,即使是私有仓库,也是感觉不安全的。 9 | 10 | 对于公司进行Docker开发的话,应该维护自己一个内网的私有仓库。这样不仅便于下载速度快,节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可,而且提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。 11 | 12 | #### 创建私有仓库的步骤如下: 13 | 14 | * 首先需要有两台机器,一台作为仓库的**Server**,一台作为仓库的**Client**,用户通过**Client**来进行镜像的提交和拉取操作。 15 | 16 | 这里,采用两台虚拟机做例子: 17 | 18 | Ubuntu 14.04x64 Server:ip地址 192.168.142.151 19 | Ubuntu 14.04x64 Client:ip地址 192.168.142.152 20 | 21 | * 在Server端启动registry容器: 22 | 23 | 启动命令: 24 | 25 | docker run -d --name registry -p 5000:5000 -v /opt/data/registry:/var/lib/registry --restart=always registry 26 | 27 | ![image](server.png) 28 | 29 | 这里建立了一个名为registry的守护式容器,挂载了服务器目录/opt/data/registry,映射端口为5000,这样在本地或者远程就可以通过该端口来访问仓库。 30 | 31 | * 在Client端进行Docker配置: 32 | 33 | 修改配置文件**/etc/default/docker**,在DOCKER_OPTS中加入"**--insecure-registry 192.168.142.151:5000**"。这样把一个通过认证的安全证书加到Registry服务中。 34 | 35 | ![image](config.png) 36 | 37 | 38 | 修改完配置,要重启docker进程: 39 | 40 | sudo service docker restart 41 | 42 | * 在Client端进行镜像的推送和拉取: 43 | 44 | 标签指定服务ip和端口,即仓库名: 45 | 46 | docker tag hello-world 192.168.142.151:5000/myfirstimage 47 | 48 | 向仓库推送镜像: 49 | 50 | docker push 192.168.142.151:5000/myfirstimage 51 | 52 | ![image](pull.png) 53 | 54 | 删除本地镜像: 55 | 56 | docker rmi 192.168.142.151:5000/myfirstimage 57 | 58 | 从仓库拉取镜像 59 | 60 | docker pull 192.168.142.151:5000/myfirstimage 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /3. Docker部署私有仓库/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/3. Docker部署私有仓库/config.png -------------------------------------------------------------------------------- /3. Docker部署私有仓库/pull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/3. Docker部署私有仓库/pull.png -------------------------------------------------------------------------------- /3. Docker部署私有仓库/server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/3. Docker部署私有仓库/server.png -------------------------------------------------------------------------------- /3. Docker部署私有仓库/官方部署Registry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/3. Docker部署私有仓库/官方部署Registry.png -------------------------------------------------------------------------------- /4. Docker私有仓库使用域名和限制登录/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/4. Docker私有仓库使用域名和限制登录/1.png -------------------------------------------------------------------------------- /4. Docker私有仓库使用域名和限制登录/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/4. Docker私有仓库使用域名和限制登录/2.png -------------------------------------------------------------------------------- /4. Docker私有仓库使用域名和限制登录/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/4. Docker私有仓库使用域名和限制登录/3.png -------------------------------------------------------------------------------- /4. Docker私有仓库使用域名和限制登录/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/4. Docker私有仓库使用域名和限制登录/4.png -------------------------------------------------------------------------------- /4. Docker私有仓库使用域名和限制登录/ReadMe.md: -------------------------------------------------------------------------------- 1 | ``` 2 | Docker私有仓库使用域名和限制登录 3 | Author:LiNing 4 | ``` 5 | 6 | Docker私有仓库一般使用**Host:Port**形式来代表仓库名称,如果有域名指向这个**Host:Port**,那么我们可以使用域名来代表仓库名称,这样一方面比较容易记忆,另一方面不会轻易暴露Registry使用的IP和端口。 7 | 8 | ### 1. 使用域名登录: 9 | 10 | 前提:假设域名 **myregistrydomain.com** 指向 **xxx.xxx.xxx.xx:5000**,如果不想花钱的话,改本地host。 11 | 12 | #### 在Registry服务端: 13 | 14 | * 从CA提供商获取证书: 15 | 16 | 首先,你需要从一个CA提供商获取证书,如果在信任区域内,可以使用自签名证书,使用**openssl**生成。 17 | 18 | 其中,证书文件和秘钥文件分别为crt和key文件,分别拷贝到/opt/data/certs/domain.crt和/opt/data/certs/domain.key 19 | 20 | mkdir -p /opt/data/certs 21 | openssl req -newkey rsa:4096 -nodes -sha256 \ 22 | -keyout /opt/data/certs/domain.key -x509 -days 365 \ 23 | -out /opt/data/certs/domain.crt 24 | 25 | 官网上这么说的 26 | 27 | ![image](key.png) 28 | 29 | 使用自签名证书需要注意的一点就是,在设置CN(Common Name)的时候,把要配置的域名写上。 30 | 31 | * 运行Docker服务: 32 | 33 | 34 | docker run -d --name registry -p 5000:5000 --restart=always \ 35 | -v /opt/data/certs:/certs \ 36 | -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ 37 | -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 38 | registry 39 | 40 | #### 在Registry客户端: 41 | 42 | 同样需要将服务端的证书**domain.crt**复制到客户端/etc/docker/certs.d/myregistrydomain.com:5000目录下,命名文件为**ca.crt**,其中**myregistrydomain.com:5000**为你注册的域名和使用的端口。 43 | 44 | 可以使用域名来代表仓库,进行push和pull操作,如: 45 | 46 | docker tag hello-world myregistrydomain.com:5000/myfirstimage 47 | docker push myregistrydomain.com:5000/myfirstimage 48 | docker rmi myregistrydomain.com:5000/myfirstimage 49 | docker pull myregistrydomain.com:5000/myfirstimage 50 | 51 | ### 2. 限制登录: 52 | 53 | #### 在Registry服务端: 54 | 55 | * 设置用户名和密码。 56 | 57 | ![image](1.png) 58 | 59 | 这里,设置用户名为testuser,密码为testpassword. 60 | 可以看到在生成的htpasswd中,保存了用户名和密码的相关信息。 61 | 62 | * 运行Docker服务: 63 | 64 | 65 | docker run -d --name registry -p 5000:5000 --restart=always \ 66 | -v /opt/data/auth:/auth \ 67 | -e "REGISTRY_AUTH=htpasswd" 68 | -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ 69 | -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ 70 | registry 71 | 72 | ![image](2.png) 73 | 74 | 可以看到服务已经在Linux后台运行,并且服务器的5000端口指向了registry容器的5000端口,这样就可以通过“IP+端口”的方式进行访问了。 75 | 76 | #### 在Registry客户端: 77 | 78 | 采用与登录Docker Hub一样的命令即可,如在服务器上看到的IP为192.168.142.148,则 79 | 80 | ![image](3.png) 81 | 82 | 输入命令: 83 | 84 | docker login 192.168.142.148:5000 85 | 86 | 会提示输入用户名和密码,输入正确则登录成功,接下来就可以进行push和pull操作了。 87 | 88 | ![image](4.png) -------------------------------------------------------------------------------- /4. Docker私有仓库使用域名和限制登录/key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/4. Docker私有仓库使用域名和限制登录/key.png -------------------------------------------------------------------------------- /5. Dockerfile使用总结/ReadMe.md: -------------------------------------------------------------------------------- 1 | ``` 2 | Dockerfile使用总结 3 | Author:LiNing 4 | ``` 5 | 6 | Docker镜像采用的是**分层存储**的概念,制作镜像,实际上就是定制每一层所添加的配置、文件等。使用**"docker commit"**命令可以实现Docker镜像的制作,但是有很多不足,比如commit对镜像操作都是黑箱操作,除了制作镜像的人,其他人很难获知制作镜像的流程,而且每次操作都会在镜像当前层增加一层,并不能删除上一层的东西,这使得每次修改都会使镜像的体积越来越大。 7 | 8 | Dockerfile解决了这些问题,它要求我们把**每一层构建的命令**都写入脚本,从而利用这个脚本来制作镜像。 9 | 10 | ![image](docker.jpg) 11 | 12 | #### 基于Dockerfile创建docker镜像 13 | 14 | 创建空目录,在空目录下创建Dockerfile: 15 | 16 | mkdir mydockerbuild 17 | cd mydockerbuild 18 | vim Dockerfile 19 | 20 | Build操作,会自动读取当前路径下Dockerfile文件: 21 | 22 | docker build -t new_image . 23 | 24 | #### Dockerfile命令介绍 25 | 26 | FROM 27 | 28 | FROM 29 | FROM : 30 | FROM @ 31 | Dockerfile中非注释行的第一个指令 32 | 如 33 | FROM ubuntu:14.04 34 | 35 | MAINTAINER 36 | 37 | MAINTAINER LiNing 38 | 39 | RUN 推荐使用数组形式 40 | 41 | RUN ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数) 42 | RUN command param1 param2 (shell form 作为"/bin/sh -c"的参数) 43 | 如 44 | RUN apt-get update && apt-get install -y \ 45 | curl \ 46 | nginx \ 47 | && rm -rf /var/lib/apt/lists/* 48 | RUN只是在构建镜像build的时候执行 49 | 50 | CMD 推荐使用数组形式 51 | 52 | CMD ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数) 53 | CMD command param1 param2 (shell form 作为"/bin/sh -c"的参数) 54 | CMD ["param1", "param2"] (as default parameters to ENTRYPOINT) 55 | 如 56 | CMD ["/bin/echo", "this is a echo test"] 57 | docker run -it new_image 58 | CMD会在启动容器run时执行,构建镜像build时不执行 59 | 如果用户启动容器run时指定了运行的命令,则会覆盖掉CMD指定的命令 60 | CMD只有最后一个有效 61 | 62 | ENTRYPOINT 推荐使用数组形式 63 | 64 | ENTRYPOINT ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数) 65 | ENTRYPOINT command param1 param2 (shell form 作为"/bin/sh -c"的参数) 66 | 如 67 | ENTRYPOINT ["/bin/echo"] 68 | CMD ["this is a echo test"] # 如果docker run期间如果没有参数的传递,会默认CMD指定的参数 69 | docker run -it new_image "this is a test" 70 | ENTRYPOINT会在启动容器run时执行,构建镜像build时不执行 71 | 如果用户启动容器run时指定了运行的命令,则不会覆盖掉ENTRYPOINT指定的命令,可以使用docker run --entrypoint覆盖Dockerfile中的ENTRYPOINT 72 | ENTRYPOINT只有最后一个有效 73 | 74 | EXPOSE 75 | 76 | EXPOSE [...] 77 | Docker服务端容器对外映射的本地端口,需要在启动容器run时使用-p或者-P选项生效 78 | 79 | LABEL 80 | 81 | LABEL = = = ... 82 | 83 | ENV 84 | 85 | ENV # 只能设置一个变量 86 | ENV = ... # 允许一次设置多个变量 87 | 88 | VOLUME 89 | 90 | VOLUME ["", "", ...] 91 | VOLUME 92 | 将本地主机目录挂载到目标容器中,将其他容器挂载的挂载点挂载到目标容器中 93 | 94 | ADD 95 | 96 | ADD ... ,源可以是URL 97 | ADD local_tar_file /temp 复制当前目录下文件到容器/temp目录,如果是压缩文件则自动解压缩复制 98 | 99 | COPY 100 | 101 | COPY ... ,源不可以是URL 102 | COPY local_files /temp 复制当前目录下文件到容器/temp目录 103 | 104 | USER 105 | 106 | USER 107 | 指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户 108 | 109 | WORKDIR 110 | 111 | WORKDIR 112 | 进入容器的默认路径,相当于cd,后续的RUN、CMD、ENTRYPOINT也会使用指定路径 113 | 114 | ONBUILD 115 | 116 | ONBUILD [instruction] 117 | 使用该dockerfile生成的镜像A,并不执行ONBUILD中命令,如再来个dockerfile基础镜像为镜像A时,生成的镜像B时就会执行ONBUILD中的命令 118 | 119 | #### Dockerfile优化手段 120 | 121 | * 容器能快速迭代 122 | * 使用.dockerignore文件 123 | * 不要安装不必要的程序包 124 | * 单一容器只运行单一进程 125 | * 最小化镜像层数 126 | * 对多行参数进行排序 127 | * 构建镜像使用缓存 -------------------------------------------------------------------------------- /5. Dockerfile使用总结/docker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/5. Dockerfile使用总结/docker.jpg -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/6. 使用docker-compose实现容器编排/1.png -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/6. 使用docker-compose实现容器编排/2.png -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/6. 使用docker-compose实现容器编排/3.png -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/6. 使用docker-compose实现容器编排/4.png -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/6. 使用docker-compose实现容器编排/5.png -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/6. 使用docker-compose实现容器编排/6.png -------------------------------------------------------------------------------- /6. 使用docker-compose实现容器编排/ReadMe.md: -------------------------------------------------------------------------------- 1 | ``` 2 | Dockerfile使用总结 3 | Author:LiNing 4 | ``` 5 | 6 | 创建一个容器,我们可以通过**Dockerfile**模板文件对镜像进行创建并按照配置要求启动。然而,一般项目往往需要多个容器相互配合才能完成某项任务,比如说在一个web项目中,除了web服务容器,往往还需要后端的数据库服务容器,甚至还需要负载均衡容器等。如何有效地做好容器之间的编排,是**Docker Compose**要做的内容。 7 | 8 | Docker Compose是**定义和运行多个Docker容器的工具**,它主要管理一个**项目(project)**,这个项目是由一组关联的应用容器组成的一个完整业务单元,而每个应用容器则对应一个**服务(service)**,当然服务可能只包含一个**容器(container)**实例,也可能包括若干运行相同镜像的**容器(container)**实例。 9 | 10 | Docker Compose的核心就在于**“一个文件”**和**“一条命令”**。所谓**“一个文件”**,是指docker-compose.yml,在这个文件中我们可以进行项目的配置,包括服务的定义。而**“一条命令”**则指,我们只需要类似docker-compose up这样简单的命令即可管理项目。其他帮助和命令,我们可以通过**docker-compose -h**进行查询。 11 | 12 | ![image](1.png) 13 | 14 | ![image](2.png) 15 | 16 | 为了更好地理解docker-compose如何进行容器编排,下面运行一个python web应用,其中web框架基于flask,计数器基于redis。 17 | 18 | ##### 我们要实现的效果就是,每访问一次web服务网址,计数器对应加1。 19 | 20 | ### 创建项目目录 21 | 22 | 如果在启动项目时,如果没有指定具体的项目名称,则项目所在的目录名作为默认的项目名称。 23 | 24 | mkdir composetest 25 | cd composetest 26 | 27 | ### 使用Dockerfile定义镜像配置 28 | 29 | 在composetest目录下,创建3个文件,内容依次为: 30 | 31 | app.py 32 | 33 | #coding: utf-8 34 | from flask import Flask 35 | from redis import Redis 36 | app = Flask(__name__) 37 | redis = Redis(host='redis', port=6379) # ''中的redis对应服务名 38 | @app.route('/') 39 | def hello(): 40 | count = redis.incr('hits') 41 | return 'Hello World! I have been seen {} times.\n'.format(count) 42 | if __name__ == "__main__": 43 | app.run(host="0.0.0.0", debug=True) 44 | 45 | requirements.txt 46 | 47 | flask 48 | redis 49 | 50 | Dockefile 51 | 52 | FROM python:2.7 53 | ADD . /code 54 | WORKDIR /code 55 | RUN pip install -r requirements.txt 56 | CMD ["python", "app.py"] 57 | 58 | 这样,我们定义了web服务镜像的配置。在第一次启动项目的时候,docker-compose会使用Dockerfile创建一个名为composetest_web的镜像。 59 | 60 | ### 使用Docker Compose来管理项目 61 | 62 | #### 定义项目配置文件docker-compose.yml 63 | 64 | 在composetest目录下,创建docker-compose.yml,内容为: 65 | 66 | version: '3' 67 | services: 68 | web: 69 | build: . 70 | ports: 71 | - "5000:5000" 72 | volumes: 73 | - .:/code 74 | redis: 75 | image: redis 76 | 77 | docker-compose.yml中定义了web和redis服务,对于web服务: 78 | 79 | build 在当前目录从Dockerfile创建一个镜像 80 | ports 端口映射,开放容器5000端口映射到宿主机5000端口 81 | volumes 挂载数据卷,挂载容器目录/code对应到宿主机当前目录 82 | 83 | ![image](3.png) 84 | 85 | 此时我们需要的文件都准备好了,开始启动项目: 86 | 87 | docker-compose up 88 | 89 | ![image](4.png) 90 | 91 | 此时我们可以通过浏览器访问对应的 http://ip:5000 地址,如果在服务本地访问,则对应 http://localhost:5000 。 92 | 93 | ![image](5.png) 94 | 95 | 可以看到每访问一次web服务地址,计数器对应加1。如果要更新应用,因为挂载了数据卷,只需修改app.py保存即可。 96 | 97 | ### 使用容器互联 98 | 99 | 除了使用docker-compose来进行容器编排,如果情况不太复杂,我们也可以使用容器互联的手段实现项目需求。容器互联要求针对多个容器,分别按顺序启动并指明依赖关系,也就是利用好**"--link"**这个参数。 100 | 101 | 同样,在composetest目录下,先启动redis服务容器: 102 | 103 | docker run -d --name redis redis 104 | 105 | 创建web服务镜像: 106 | 107 | docker build -t dockerfile_web . 108 | 109 | 通过查看镜像,可以看到生成的dockerfile_web镜像,在docker-compose.yml中定义的服务依赖的镜像也已经具备了,如composetest_web。由于dockerfile_web和composetest_web镜像都是由同一个Dockerfile模板文件生成的,本质上它们是一样的。 110 | 111 | ![image](6.png) 112 | 113 | 启动web服务容器,并关联redis服务容器: 114 | 115 | docker run --name web -p 5000:5000 -v $(pwd):/code --link redis:webredis dockerfile_web 116 | 117 | 这样也能得到同样的效果,但是,对于复杂的容器编排情况,还是乖乖地使用docker-compose等利器吧。 118 | -------------------------------------------------------------------------------- /Docker and Vagrant.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/Docker and Vagrant.pdf -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | # Docker入门之精华版 2 | 3 | *** 4 | 5 | #### [1. Docker入门基础](./1.%20Docker%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80/ReadMe.md) 6 | 7 | #### [2. Docker数据卷与数据卷容器](./2.%20Docker%E6%95%B0%E6%8D%AE%E5%8D%B7%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%8D%B7%E5%AE%B9%E5%99%A8/ReadMe.md) 8 | 9 | #### [3. Docker部署私有仓库](./3.%20Docker%E9%83%A8%E7%BD%B2%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93/ReadMe.md) 10 | 11 | #### [4. Docker私有仓库使用域名和限制登录](./4.%20Docker%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93%E4%BD%BF%E7%94%A8%E5%9F%9F%E5%90%8D%E5%92%8C%E9%99%90%E5%88%B6%E7%99%BB%E5%BD%95/ReadMe.md) 12 | 13 | #### [5. Dockerfile使用总结](./5.%20Dockerfile%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/ReadMe.md) 14 | 15 | #### [6. 使用docker-compose实现容器编排](./6.%20%E4%BD%BF%E7%94%A8docker-compose%E5%AE%9E%E7%8E%B0%E5%AE%B9%E5%99%A8%E7%BC%96%E6%8E%92/ReadMe.md) 16 | -------------------------------------------------------------------------------- /pdf/1. Docker入门基础.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/pdf/1. Docker入门基础.pdf -------------------------------------------------------------------------------- /pdf/2. Docker数据卷与数据卷容器.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/pdf/2. Docker数据卷与数据卷容器.pdf -------------------------------------------------------------------------------- /pdf/3. Docker部署私有仓库.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/pdf/3. Docker部署私有仓库.pdf -------------------------------------------------------------------------------- /pdf/4. Docker私有仓库使用域名和限制登录.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/pdf/4. Docker私有仓库使用域名和限制登录.pdf -------------------------------------------------------------------------------- /pdf/5. Dockerfile使用总结.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/pdf/5. Dockerfile使用总结.pdf -------------------------------------------------------------------------------- /pdf/6. 使用docker-compose实现容器编排.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lining0806/DockerNotes/7db18ca1d1fb65e1ed07a1e4708e9f6c11c103d2/pdf/6. 使用docker-compose实现容器编排.pdf --------------------------------------------------------------------------------