- docker 是一个开源的应用容器引擎
- 可以使用docker将应用程序和依赖打包到一个镜像之中
- 可以非常方便的移植到其他机器上运行
- 使用docker构建打包我们的应用(build),之后可以像集装箱一样很方便的传输到别的机器上(ship),可以在任何环境下运行我们的应用程序
- 用官方的话概况为:Build, Ship, and Run Any App, Anywhere
- docker可以运行在物理机、虚拟机、云平台、笔记本,我们不用担心环境的变化导致程序不能正常运行的问题
- 语言或框架在不同版本之间会存在很大差别, 如果要部署不同版本依赖的应用,将增加运维的复杂程度,容器技术的发展很好的解决了这一问题
- 容器技术可以让我们大规模的部署应用:
- 早在2016年,京东就将全部流量运行在docker之上,运行容器达到15万个,docker完美支持了618的大促销
- 阿里这边也使用了几十万个docker来提供服务
- 我们也可以把docker来当成虚拟机来使用
- 虚拟机可以在一台物理机上运行多个操作系统
- 虚拟机是完全虚拟出一整套的硬件设备,里面的每个操作系统都是完整的
- docker容器则非常简单,应用进程直接运行在物理机的内核上,docker容器上面没有内核,只有应用
- docker不需要硬件虚拟,容器要比传统的虚拟机更轻便,效率更高,性能接近原生
- 可以在单台物理机上可以启动上千个docker容器(要看物理机的具体配置)
- docker容器技术被应用在自动化打包发布, 自动化测试, 持续集成, 以及快速的部署应用
1 ) Image 镜像
- 镜像是一个特殊的文件系统,是个虚拟的概念,是多层文件系统联合组成的
- 镜像构建好后,基本不去改变它
2 ) Container 容器
- 将docker镜像运行后就会产生一个容器
- 容器的本质是进程,每个容器都有属于自己的独立命名空间,也就是容器内运行的进程运行在一个隔离的环境中,感觉上就是一个独立的操作系统
- 可以在同一个镜像上启动多个容器,每个容器之间也是相互独立的,如果多个容器同时修改镜像上的一个文件也不会导致冲突
- 镜像是分层文件系统,一个镜像构建好后是不会发生改变的,所以不会造成冲突
- 通过镜像启动容器后,容器会创造一个临时的存储层,当容器被删除时,存储层也会随之消失
- 在使用容器的时候,不要在容器内部保存一些数据,我们会使用数据卷来存放数据
3 ) Repository 仓库
- 仓库是用于存储镜像的,构建好镜像后,将镜像文件保存在仓库之中
- 每个仓库可以包含多个标签,每个标签对应着一个镜像
- 比如制作一个叫ubuntu的镜像,我们可以用
ubuntu:15.01
表示我们的镜像,15.01就是标签(tag) - 如果在构建镜像的时候,没有写标签,docker会使用一个
latest
来作为默认的标签
1 ) docker版本
- CE 社区版 Community Edition (免费)
- EE 企业版 Enterprise Edition (收费)
- 支持各大流行操作系统:linux、windows、macos等
- 我们在这里只记录在linux上的安装和使用
2 ) docker的安装
- 在docker官方文档上:
docs.docker.com
点击左侧Get Docker
找到Docker CE
下的Ubuntu
文档 - 首先要更新apt, $
sudo apt-get update
- 然后安装docker所需要的一些依赖:
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
- 第三步, 添加docker的官方GPG key, $
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 第四步, 验证下key, $
sudo apt-key fingerprint 0EBFCD88
和 官方一致,则表示成功了 - 第五步, 添加docker仓库
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
- 第六步, 正式安装docker
- 先update, $
sudo apt-get update
- 使用apt进行安装, $
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 先update, $
- 第七步, 查看docker版本, $
docker --version
- $
service docker stop
停止 - $
service docker start
开启 - $
service docker restart
重启
- $
docker info
查看docker更多信息 - $
docker --help
查看docker帮助文档
1 ) Image 镜像仓库
-
hub.docker.com
- 是docker官方的镜像仓库,也是我们最常用的镜像仓库
- 点击explore进入: hub.docker.com/explore 可以搜索我们想要的docker镜像
- 如果想要ubuntu操作系统镜像,只需要搜索 ubuntu 即可,我们可以通过
docker pull
来拉取这个镜像 $docker pull ubuntu
- 每个镜像都有一个标签,我们可以拉取特定版本的镜像,如:$
docker pull ubuntu:17.10
- 我们也可以拉取 alpine 镜像, 这个镜像也是一个linux的操作系统镜像 $
docker pull alpine
没有指定标签, 默认拉取latest标签
-
dev.aliyun.com
- 如果docker镜像下载的非常慢, 我们可以指定国内的阿里云服务器
- 进入dev.aliyun.com登录后进入
管理中心
, 进入容器镜像服务
, 点进镜像加速器,选择对应的操作系统如Ubuntu, 复制并执行sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors":["https://bwxenga6.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
- 执行完成后,docker就默认在阿里云上拉取镜像了,速度会提升很多
2 ) Image 镜像管理的相关命令
- 在docker中,所有的镜像相关的操作都封装在
docker image
这个命令下 - 查看当前已经拉取的镜像 $
docker image ls
或 $docker images
REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest 3fd9065eaf02 3 months ago 4.15MB
- $
docker pull
命令等同于 $docker image pull
- $
docker image pull hello-world
hello-world
是docker提供用于测试的镜像
- $
- 删除
hello-world
镜像, $docker image rm hello-world
或 $docker rmi hello-world
- 其他命令通过 $
docker
或 $docker --help
或 $docker image pull --help
等 来查看具体使用
- 在docker中将一个镜像运行起来就可以创造一个新的容器
- $
docker container
用于所有容器相关的管理命令 - $
docker container ls
列出所有容器 - $
docker container rm
删除一个或多个容器 - $
docker container run
在一个新容器中运行一条命令 - $
docker container stop
停止一个或多个运行中的容器 - $
docker container kill
强制结束一个或多个运行中的容器
具体示例:
- $
docker container run alpine echo "hello docker"
通过运行一个镜像得到一个容器- alpine是一个linux操作系统
- echo "hello docker" 是将在alpine上执行的一条命令
- 这时候我们已经成功的运行了一个容器
- 如果alpine这个镜像文件不存在,docker会自动pull这个镜像
- 这行命令表示在alpine镜像所启动的容器里面执行一句指令echo "hello docker"
docker container run
还可以省略成docker run
即:$docker run alpine echo "hello docker"
- 当前容器在执行完这条命令时,便自动停止
- 列出当前启动的容器, $
docker container ls
或 $docker ps
- 列出所有容器, $
docker container ls -a
或 $docker ps -a
- 删除容器:$
docker container rm 容器ID
- 运行一个不会自动停止的命令 $
docker run alpine ping www.baidu.com
,ctrl + c结束容器运行 - 在实际应用中,我们有大量的服务需要长时间运行, 我们可以使用-d的选项,让容器以后台服务的方式长时间的运行
- 如:$
docker run -d alpine ping www.baidu.com
打印了一个容器ID,没有占用终端,以一个服务的方式来启动了我们的容器 - 我们需要停止这个容器时,就可以通过 $
docker stop 容器ID
, 可能需要等待一些时间,很快
- 如:$
- 在实际使用中, 每次run之后就会产生一个新的容器, 有大量的容器在运行结束后,并不需要保留,我们可以使用
--rm
选项来回收(自动删除)- 如:$
docker run --rm alpine echo "hello docker"
- 自动删除选项会将在容器中产生的数据一并删除,如果要持久保存容器中的数据,就要用到数据卷的方式
- 如:$
- 大多数情况下,我们需要容器一直运行着对外提供服务,即容器以一个服务的方式来运行,我们以后来说明
- 在一个镜像上运行一个容器的时候,容器会创建一个临时的存储层, 来临时的保存容器中所产生的数据,当容器被删除时, 存储层同时被删除
- 为了将容器中产生的数据及时保留下来,可以将物理机中的一个目录映射到容器中去,容器会在这个映射后的目录中保存数据,同时会永久的保存在物理机上,而不会随着容器的消失而消失
- 目录的映射 $
docker run -v
- 启动一个容器:$
docker run --rm -v /root:/data alpine touch /data/test.txt
- 将物理机上的/root目录映射到容器中的/data目录
- 执行完毕后,发现在物理机/root目录下存在一个test.txt文件
- 可以优化指令:$
docker run --rm -v $(pwd):/data alpine touch /data/test.txt
- 这条命令是说将当前目录映射到/data目录中去, 如果当前目录有空格,需要加上"", 即:
- $
docker run --rm -v "$(pwd):/data" alpine touch /data/test.txt
这里在映射的关系上加上双引号 - 还有一种只读挂载的方式: $
docker run --rm -v $(pwd):/data:ro alpine touch /data/test2.txt
- 这里的
ro
表示readonly 只读的映射
- 启动一个容器:$