1. 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 添加下载源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 查看可以安装的版本
yum list docker-ce --showduplicates | sort -r
4. yum -y install docker-ce-20.10.7
5. 启动 Docker 并设置开机自启
systemctl start docker
systemctl enable docker
安装成功后,在命令行输入 docker 回车,有反应就说明是成功了。
1. 安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
2. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
确认 Docker 是否安装成功:
docker run --name nginx1 -d -p 8080:80 nginx
执行完成后,打开浏览器,如果能访问到 nginx,就表示装好了。
查看容器:docker ps
查看所有容器:docker ps -a
查看最新创建的容器:docker ps -l
查看最新创建的n个容器:docker ps -n=XXX
例如创建一个 nginx 容器:docker create nginx
——此时容器处于停止状态。
此时创建的容器并未运行,处于停止状态,容器的 name 是随机生成的,开发者也可以在创建容器时指定 name,如下:
docker create --name=nginx nginx
此时的name属性就不是随机生成的,而是用户指定的name。
这种方式只是单纯的创建了一个用户,并未启动。
如果开发者需要既创建又启动容器,则可以使用docker run
命令。docker run
命令又可以启动两种不同模式的容器:后台型容器和交互型容器,顾名思义,后台型容器就是一个在后台运行的容器,默默的在后台执行计算就行了,不需要和开发者进行交互,而交互型容器则需要接收开发者的输入进行处理给出反馈。对于开发者而言,大部分情况下创建的都是后台型容器,不过在很多时候,即使是后台型容器也不可避免的需要进行交互,下面分别来看。
后台型容器以nginx为例,一般nginx在后台运行即可:
docker run --name nginx1 -d -p 8080:80 nginx
首先依然会去本地检查,本地没有相应的容器,则会去Docker Hub上查找,查找到了下载并运行,并且生成了一个容器id。运行成功后,在浏览器中输入http://localhost:8080
就能看到Nginx的默认页面了
也可以创建交互型容器,例如创建一个ubuntu容器,开发者可能需要在ubuntu上面输入命令执行相关操作,交互型容器创建方式如下:
docker run --name ubuntu -it ubuntu /bin/bash
容器在运行过程中,会不可避免的出问题,出了问题时,需要能够自动重启,在容器启动时使用–restart参数可以实现这一需求。根据docker官网的解释,docker的重启策略可以分为4种,如下:
拿 3 举例子:
docker run -d --name mynginx -p 8080:80 --restart=always nginx
容器停止后还依然存在,如果需要,还可以通过docker start
命令再次重启一个容器,如果不需要一个容器,则可以通过docker rm
命令删除一个容器。删除容器时,只能删除已经停止运行的容器,不能删除正在运行的容器。
可以通过name或者id删除一个容器。如果非要删除一个正在运行的容器,可以通过 -f 参数实现,如下:
容器也可以批量删除,命令如下:
docker rm $(docker ps -a -q)
docker ps -a -q
会列出所有容器的id,供rm命令删除。
如下命令也支持删除已退出的孤立的容器:
docker container prune
如果容器在后台启动,则可以使用docker exec
在容器内执行命令。不同于docker attach
,使用docker exec
即使用户从终端退出,容器也不会停止运行,而使用docker attach
时,如果用户从终端退出,则容器会停止运行。如下图:
容器创建成功后,用户可以通过docker inspect
命令查看容器的详细信息,这些详细信息包括容器的id、容器名、环境变量、运行命令、主机配置、网络配置以及数据卷配置等信息。
使用docker top
命令可以查看容器中正在运行的进程,首先确保容器已经启动,然后执行docker top
命令,如下:
交互型容器查看日志很方便,但是对于后台型容器,如果要查看日志,则可以使用docker提供的docker logs
命令来查看,如下:
如下图,首先启动一个不停打日志的容器,然后利用docker logs
命令查看日志,但是默认情况下只能查看到历史日志,无法查看实时日志,使用-f
参数后,就可以查看实时日志了。
使用--tail
参数可以精确控制日志的输出行数,-t
参数则可以显示日志的输出时间。
该命令在执行的过程中,首先输出最近的三行日志,同时由于添加了-f
参数,因此,还会有其他日志持续输出。同时,因为添加了-t
参数,时间随同日志一起打印出来了。
比如现在用的虚拟机 vmware,如果里面有某些东西不一样,想给别人,就可以直接复制虚拟机文件目录即可;但如果是 docker,则需要打包。
使用export命令可以导出容器,具体操作如下:
本案例中我首先创建一个nginx容器,然后启动,启动成功后,将本地一个index.html文件上传到容器中,修改nginx首页的显示内容。具体操作步骤如下:
docker run -itd --name nginx -p 80:80 nginx
vi ./blog/docker/index.html
docker cp ./blog/docker/index.html nginx:/usr/share/nginx/html/
镜像也是docker的核心组件之一,镜像是容器运行的基础,容器是镜像运行后的形态。
总体来说,镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一层的改变以读写层的形式增加到原来的只读文件上。
镜像与容器的关系:
前文已经向读者介绍过容器的使用了,细心的读者可能已经发现,容器在启动或者创建时,必须指定一个镜像的名称或者id,其实,这时镜像所扮演的角色就是容器的模版,不同的镜像可以构造出不同的容器。如下命令:
docker run -itd --name nginx nginx
命令中的最后一个nginx即表示创建该容器所需要的模版,当然这里还省略了一些信息,这些我们后文会详细介绍。
镜像的体系结构:
镜像的最底层是一个启动文件系统(bootfs)镜像,bootfs的上层镜像叫做根镜像,一般来说,根镜像是一个操作系统,例如Ubuntu、CentOS等,用户的镜像必须构建于根镜像之上,在根镜像之上,用户可以构建出各种各样的其他镜像。
从上面的介绍读者可以看出,镜像的本质其实就是一系列文件的集合,一层套一层的结构有点类似于Git。
镜像的写时复制机制:
通过docker run
命令指定一个容器创建镜像时,实际上是在该镜像之上创建一个空的可读写的文件系统层级,可以将这个文件系统层级当成一个临时的镜像来对待,而命令中所指的模版镜像则可以称之为父镜像。父镜像的内容都是以只读的方式挂载进来的,容器会读取共享父镜像的内容,用户所做的所有修改都是在文件系统中,不会对父镜像造成任何影响。当然用户可以通过其他一些手段使修改持久化到父镜像中,这个我们后面会详细介绍到。
用户可以通过docker images
命令查看本地所有镜像。
当用户执行docker run
命令时,就会自动去Docker Hub上下载相关的镜像,这个就不再重复演示,开发者也可以通过search命令去Docker Hub上搜索符合要求的镜像,如下:
在执行docker run
命令时再去下载,速度会有点慢,如果希望该命令能够快速执行,可以在执行之前,先利用docker pull
命令将镜像先下载下来,然后再运行。
镜像可以通过docker rmi
命令进行删除,参数为镜像的id或者镜像名,参数可以有多个,多个参数之间用空格隔开。
有的时候,无法删除一个镜像,大部分原因是因为该镜像被一个容器所依赖,此时需要先删除容器,然后就可以删除镜像了。
在实际的开发环境或者生产环境,容器往往都不是独立运行的,经常需要多个容器一起运行,此时,如果继续使用run命令启动容器,就会非常不便,在这种情况下,docker-compose是一个不错的选择,使用docker-compose可以实现容器编排,本文就来看看docker-compose的使用。
本文以jpress这样一个开源网站的部署为例,向读者介绍docker-compose的使用。jpress是Java版的wordPress,不过我们不必关注jpress的实现,在这里我们只需要将之当作一个普通的应用即可,完成该项目的部署工作。
简而言之就是:容器很多,一个个启动太傻逼了,所以如果有一种方式可以批量启动和关闭就很舒服。这就是 Dockerfile。