一、我们为什么需要Docker?
相信大家都遇到过部署一个应用时缺少依赖的情况,往往我们需要手动解决依赖问题,在解决了依赖问题以后,好不容易安装了这个应用,但是我们更换了计算机以后又需要重复上面步骤将这个软件再安装一次。再比如说,大家在同时部署多个应用时,他们相互依赖的系统软件包发生了冲突,我们应该怎么解决呢?放弃一个应用?还有就是,在开发环境中,总有可能遇到自己的环境和服务器环境不同,导致本地能跑,服务器不能跑......上面这些问题都是因为环境问题导致的应用不能运行,不管是环境冲突还是环境缺失,我们总会因为环境问题导致我们的应用无法运行。那,有没有一种应用可以帮我解决这些环境问题,让应用在构建的时候就连同环境被打包好作为一个镜像,我们要运行某个应用的时候,用特殊的应用打开这个镜像即可。因为镜像中集成了这个应用运行所需的环境,所以我们也不需要考虑这个应用运行的环境问题。再加上每个镜像都单独运行,我们也不需要考虑应用间依赖的冲突问题。因为我们可以把应用打包成一个镜像并且集成环境,我们更不用担心到了别的计算机这个应用无法运行的问题。在上面这个能完美解决运行和依赖问题的应用就是我们的Docker,因为它强大的集成性和扩展性,深受普通用户和开发,运维人员的喜爱,那我们今天就来学习一下怎么安装Docker,并且使用它吧!
二、需要准备什么?
需要强调的是,这次的教程已经不针对纯小白了,看这篇教程的你,需要具备一定的Linux基础和一定的解决问题的能力。
首先需要准备的就是一台装有Linux系统的计算机或者虚拟机,我这里会主要使用Ubuntu进行演示。如果你想在物理机上安装Ubuntu可以参考下面的文章:
在物理机上安装Ubuntu:[Linux]如何在物理机安装Ubuntu(小白向)-CSDN博客
然后你需要准备一个稳定科学上网的环境,总之你需要保证你的计算机能够访问国际网络。网络上有很多教程,这里我就不多说了。
当你准备好以上以后,就让我们开始吧!
三、理解Docker,镜像,容器之间的关系
首先就是Docker,它是用来运行和管理容器与镜像的应用,我们的镜像与容器都是基于Docker本身。
然后是镜像,镜像是一个只读模板,它用于创建容器。镜像中包含的软件运行所必须的代码,库,依赖,配置文件和操作系统等。镜像是层叠结构的,这种层次结构也使得镜像非常高效,因为多个容器可以共享相同的基础镜像层。
最后是容器,容器是镜像运行的实例,它是一个独立的运行环境,运行在Docker的容器引擎上,容器的运行不需要完整的操作系统,它通过与宿主机共用系统内核,从而更高效,更快速。
当你初步理解了Docker,镜像,容器之间的关系以后,我们就可以开始安装Docker了。
四、Docker的安装
1.网络环境的配置
因为Docker的部分容器并不那么安全,所以国家对Docker的访问进行了限制,我们现在需要配置我们的网络,让我们能够正常访问Docker。之前也提到了,我们需要准备一个科学上网的环境,目前最直接的科学上网方式就是使用代理服务器,我们需要在终端中配置我们的代理服务器。首先一点你需要清楚的是,在Ubuntu系统的图形化设置中配置的代理并不能使全局生效,因为终端中使用的是Bashshell,然而,Bashshell有自己的代理规则。所以,并不是在系统中配置了代理,终端中就会生效。我们现在需要单独配置终端中的代理规则。我们使用下面的命令,可以打开我们当前用户的环境变量配置文件:
nano ~/.bashrc
我们需要在用户环境变量中添加下面这两条语句:
export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
这里的http_proxy和https_proxy是用来配置http和https流量的代理服务器的。这里的127.0.0.1表示代理服务器的IP地址,因为我的代理工具就在本地,所以我这里直接就写127.0.0.1,这里的7897表示我们代理服务器的端口,这个每个人的情况不一样,大家根据自己的端口进行填写。在填写好以后,我们进行一些简单的测试,输入下面的命令拉取google的主页:
wget google.com
可以看到,我们这里已经拉取成功了:
我们这里要注意的是,这里一定要使用wget去拉取而不是使用ping命令去ping谷歌的首页。
拉取成功以后,当前目录下会有一个"index.html"文件。
因为我们使用apt拉取应用的时候,大概率都会使用root,所以我们这里还要设置一下root用户的环境变量,这里也有要注意的,不是不切换到root用户就没有使用root用户,你使用sudo的时候就已经在使用root用户的环境变量了。所以,我们用上面同样的方法,打开root用户的环境变量配置文件,输入以下命令:
sudo nano /root/.bashrc
这里一定要加"sudo",不然打开就是空白的。
打开root用户的环境变量以后,我们同样的在最下方加上上面的两句。
在配置好以后,我们可以直接用上面的方法进行测试,这次测试记得切换到root用户,记得是切换到root用户,如果使用sudo,设置的代理并不会生效。
我们这里也可以不配置环境变量,直接在语句中说明我们的代理服务器,例如下面的命令:
bash
wget http_proxy=http://127.0.0.1:7897 https_proxy=http://127.0.0.1:7897 google.com
在上面这个命令中,我们在命令中就设置了代理服务器,这样做的好处就是,非常的方便,每条命令自由灵活,坏处也很明显,就是我们每次要使用代理服务器时都需要输入一长串的命令。
我们现在将配置文件中的语句屏蔽掉,然后测试一下上方的语句是否可行:
我们可以看出这样的方法也是成功的。
如果上面的方法你都不喜欢,那我们还有最后一种方法。修改apt的代理服务器,我们使用下面的命令打开apt的代理服务器配置文件:
bash
sudo nano /etc/apt/apt.conf.d/00proxy
如果没有这个文件,在所示目录下创建这个文件即可。打开配置文件以后,在配置文件中写入下面两行语句:
bash
Acquire::http::Proxy "http://localhost:7897/";
Acquire::https::Proxy "http://localhost:7897/";
acquire是apt的配置命令,用于配置apt在拉取应用或者更新包时所使用的代理服务器。我们这里的写法和上面一样,都是地址加端口号的形式,注意语句最后的分号是英文的分号并且不能省略。
配置好上面这些以后,我们的网络配置环节就已经结束了,下面我们进入Docker的安装环节。
2.安装Docker
来到这一步,我就认为大家已经解决了网络问题,后面我可能很少会提及网络问题,如果你遇到拉取失败等情况,请回到上面一步查看是不是配置环节出了问题。下面的每一条命令都有严格的顺序,必须执行完前面的命令,并且都执行成功才可以进行下一步。
我们先要使用下面的命令来安装Docker所需的依赖:
bash
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
在Docker安装成功以后,我们使用下面的命令添加官方的"GPG key":
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
安装Docker本体:
bash
sudo apt install docker-ce docker-ce-cli containerd.io
如果你在上面遇到了任何的无法访问,无法下载,无法拉取,都是网络问题导致的,请检查代理服务器和配置文件。
在Docker安装好以后,我们就可以使用下面的命令查看Docker的版本:
bash
sudo docker version
这里有一点值得注意的是,对Docker的操作命令,记得都要加上"sudo"或者切换到root进行操作。
我们可以看到,输入了命令以后输出了很多信息,其中也包含了我们Docker的版本信息。在完成了上面这些步骤以后,我们的Docker的安装就已经完成了。下面我会教大家一些简单的Docker使用技巧,有了这些技巧以后,你就能使用Docker的基本功能了。
五、Docker的使用
当我们拥有了容器和镜像的概念并且已经成功安装Docker后,我们就可以使用Docker的命令来对Docker进行操作了。下面我会演示Docker的常用命令。 之前也提到了,在使用Docker命令时,都应该加上"sudo"或者使用root的身份进行。
bash
sudo docker pull 镜像名
上面这条命令用于拉取一个Docker的镜像,命令执行以后。Docker会根据你输入的包名去Docker的镜像服务器拉取对应的镜像。之前也提到了,镜像是创建容器的基础,我们需要一个镜像作为模板来创建容器,下面我将会从拉取一个镜像开始,逐步讲解,下面我们以"nginx"的镜像为例。一般的像"nginx","mysql",这些常用软件的镜像都是维护这些软件的官方上传到仓库的。
我们使用下面的命令来拉取"nginx":
bash
sudo docker pull nginx
我们可以看到,命令执行以后,很多东西开始下载了。下载完成以后我们的"nginx"的Docker镜像就被下载下来了。
我们也可以使用下面的命令来下载指定版本的"nginx"的Docker镜像:
bash
sudo docker pull nginx:1.24.0
在镜像下载好以后,我们可以使用下面的命令来查看我们下载的镜像:
bash
sudo docker images
这条命令可以帮我们看到镜像的名字,ID号,大小等信息,我们也可以使用这条命令来查看我们刚才的拉取是否成功。如果拉取失败,或者拉取以后这里并没有拉取的镜像,都有可能是网络问题。请检查代理服务器。
我们可以使用下面的命令来创建一个容器:
bash
sudo docker run --name mynginx -d -p 8080:80 nginx
下面我们来讲解一下这条命令,这里的--name选项后面跟的就是我们要创建的容器的名字。这里的-d选项是这个容器运行方式,如果是-d的话就表示容器在后台运行,如果是-it就表示容器前台运行即进入容器。后面的-p参数表示端口映射这里我们将主机的8080端口映射到容器内部的80端口上,因为nginx内部默认监听80端口,因为加了映射,当我们访问主机的8080端口时,访问的就是容器内部的80端口,即被nginx监听的端口。最后的nginx就是我们要使用的镜像的名字了。
出现以上提示就表示创建成功了。
在创建好容器以后,我们可以使用下面的命令来查看运行中的容器:
bash
sudo docker ps
这里我们就可以查看到我们运行中的容器的各种信息,包括端口地址映射,使用的镜像等。可以在上面的命令加上-a参数,可以显示所有的docker容器,不论容器有没有在运行。
当你看到你的Docker容器在运行时,我们就可以来测试一下了。因为我们将nginx监听的端口映射到了本机的8080端口,我们就可以直接访问本机的8080端口从而访问到nginx的服务。
在浏览器中输入"127.0.0.1:8080"就可以看到:
这就表示我们的容器已经在正常运行,并且nginx的已经正常启动了。
如果我们想进入容器,并且对容器进行修改,我们就可以用到下面的命令:
bash
sudo docker exec -it mynginx /bin/bash
下面我们来解释一下这条命令,这里的-it之前提到过,表示让容器前台运行,这里的"mynginx"是我们要进入的容器的名字,后面的"bin/bash"表示我们启动容器内的bashshell命令行工具,注意这里是容器内的。
在进入容器以后,我们可以发现主机名发生了变化。
如果我们想退出容器,我们可以直接输入下面的命令:
bash
exit
如果我们想要删除一个容器,可以使用下面的命令:
bash
sudo docker rm 容器名
下面我们来演示一下:
是的如你所见,它出现了错误。错误内容:
Error response from daemon: cannot remove container "/mynginx": container is running: stop the container before removing or force remove
这个错误表示这个容器正在运行,所以我们不能删除它,我们可以使用下面的命令让这个容器停止运行:
bash
sudo docker stop mynginx
在停止以后,我们就可以删除这个容器了。
与停止容器对应的我们可以使用下面的命令启动容器:
bash
sudo docker start 容器名
我们可以使用下面的命令来删除一个镜像:
bash
sudo docker rmi 镜像名
如果你在删除一个镜像时,遇到:
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 8d8f894fb073 is using its referenced image 5ef79149e0ec
这就表示,这个镜像正在被容器占用,无法删除,要删除这个镜像我们必须先删除和它关联的容器。
以上就是我们Docker使用中的基本命令了。
六、结语
有了Docker以后,能帮我们解决许多依赖性问题,哪怕我们更换设备或者更换不同架构的设备只要我们能在这个设备上安装Docker,就能运行我们曾经部署过的应用,极大的简化了我们应用的部署流程......