Docker是什么?Ubuntu怎样安装Docker(CE)?安装Docker常见问题?

Docker是什么?

Docker 是一个供开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器部署应用程序称为容器化。 容器并不新鲜,但是他们用于轻松部署应用程序却很新鲜。

个人对于Docker的理解

在这里插入图片描述
我们观察上图(docker图标),官方已经大概的告诉了我们docker是干啥的。 在以前没有集装箱时,运输货物时需要考虑很多因素,比如:各种不同形状的货物、货物是否可以堆放等;而且如果货物需要运送到不同的港口时,卸载货物也是很麻烦的事情,可能有些货物被压在了下面,需要将上面的货物先卸下来再拿出需要的货物后再放回原先的货物,可谓十分费时费力。现在有了集装箱(相当于容器),我们就可以将不同港口、不同的货物放到集装箱之内这样就能以标准的方式来存放、运输货物了,就实现了标准化。

Docker就是采用了集装箱的原理,将应用程序放入到容器中进行封装,这样就可以在多平台上运行了,而且也实现了程序与程序之间的隔离。

集中箱化越来越受欢迎,因为集中箱化有以下优点:

  • 灵活性:即使是最复杂的应用程序也可以被封装。
  • 轻量级:容器利用并共享主机内核。
  • 可互换的:您可以实时部署更新和升级。
  • 可移植性:您可以在本地构建、部署到云,并在任何地方运行。
  • 可伸缩:您可以增加并自动分发容器副本。
  • 可堆叠:您可以垂直地、动态地堆叠服务。

镜像和容器

  • 通过运行镜像启动容器。镜像是一个可执行包,包含运行应用程序所需的所有内容–代码、运行时、库、环境变量和配置文件。
  • 容器是镜像的运行时实例–当执行镜像时,镜像在内存中会变成带有状态的镜像或用户进程。可以使用docker ps命令看到正在运行的容器列表。

容器和虚拟机

  • 容器在Linux上本地运行,并与其它容器共享主机的内核。它运行一个离散的进行。不占用比任何其他可执行程序更多的内存,使其轻量级。
  • 相反,虚拟机(VM)运行一个成熟的“客户”操作系统,通过管理程序对主机资源进行虚拟访问。一般来说,VM提供的环境、提供的资源比大多数应用程序所需的资源要多。
    在这里插入图片描述

Part 1: Ubuntu安装Docker(CE)

操作系统需求

要安装Docker CE,您需要这些Ubuntu版本之一的64位版本:

  • Cosmic 18.10
  • Bionic 18.04 (LTS)
  • Xenial 16.04 (LTS)

Docker CE支持x86_64(或amd64)、armhf、arm64、s390x (IBM Z)和ppc64le (IBM Power)体系结构。

卸载旧版本

老版本的Docker叫做docker, docker.io,或者docker-engine。如果已安装,请卸载它们:

$ sudo apt-get remove docker docker-engine docker.io containerd runc

如果apt-get报告说没有安装这些包,就可以了。

如果你之前安装过Docker CE,现在想要彻底卸载Docker CE,那么:

Docker CE包现在称为docker-ce。

① 先卸载Docker CE包
linux $ sudo apt-get purge docker-ce

② 在目录/var/lib/docker/中的内容,包括images(镜像)、containers(容器)、volumes(卷)和networks(网络)。这些文件以及一些自定义配置文件不会自动删除。删除所有镜像、容器和卷:
linux $ sudo rm -rf /var/lib/docker

注意:您必须手动删除任何已编辑的配置文件。

支持存储驱动程序

在Ubuntu上Docker CE 支持 overlay2,aufs 和 btrfs 存储驱动。

注意:在Docker Engine - Enterprise中,btrfs只支持SLES。

安装Docker CE

使用存储库安装

设置存储仓库

  1. 更新apt包索引:

    sudo apt-get update
    
  2. 安装包以允许apt通过HTTPS使用存储库:

    $ sudo apt-get install \
    	apt-transport-https \
    	ca-certificates \
    	curl \
    	gnupg-agent \
    	software-properties-common
    
  3. 添加Docker的官方GPG密钥:

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    

    通过搜索指纹的最后8个字符,验证您现在拥有指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的密钥。

    $ sudo apt-key fingerprint 0EBFCD88
    
    pub   rsa4096 2017-02-22 [SCEA]
      	9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid           [ unknown] Docker Release (CE deb) <[email protected]>
    sub   rsa4096 2017-02-22 [S]
    
  4. 使用以下命令选择其一设置稳定的存储库。

    注意:根据自己的系统任选其一进行安装即可

    ① x86_64 / amd64

    $ sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    

    ② armhf

    $ sudo add-apt-repository \
       "deb [arch=armhf] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    

    ③ arm64

    $ sudo add-apt-repository \
       "deb [arch=arm64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    

    ④ ppc64le (IBM Power)

    $ sudo add-apt-repository \
       "deb [arch=ppc64el] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    

    ⑤ s390x (IBM Z)

    $ sudo add-apt-repository \
       "deb [arch=s390x] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    

开始安装 DOCKER CE

  1. 更新 apt 包索引

    $ sudo apt-get update
    ```linux
    
  2. 安装最新版本的 Docker CE 和 containerd

    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    

    在执行该步骤时,如果出现 dpkg:处理软件包 docker(–configure)时出错 的错误信息
    请查看本博客 安装Docker常见问题第一节解决方法

  3. 通过运行hello-world映像,验证Docker CE是否正确安装。

    $ docker run hello-world
    

    注意:如果没有正常运行,可能是权限问题,可以尝试使用:

    sudo docker run hello-world

    如果不想每次运行docker命令都使用 sudo 的话:可以直接查看第 10 步操作

    这个命令下载一个测试镜像并在容器中运行它。当容器运行时,它打印一条信息消息并退出。

    如图:docker run hello-world

查看Docker版本

  1. 运行docker --version 来查看安装好的 docker 版本号
    sudo docker --version
    Docker version 18.09.3, build 774a1f4
    
  2. 运行docker info来查看安装好的 docker 完整信息
    docker info
    
    在这里插入图片描述
  3. 如果你想通过非 root 用户使用Docker,现在应该考虑将你的用户添加到 “Docker” 组,如下所示:
    sudo usermod -aG docker 这里写你的用户名
    
    记得要退出并重新登录才会生效

查看Docker镜像与容器

  1. 列出下载到您的机器上的hello-world镜像:
    docker image ls
    在这里插入图片描述
  2. 列出hello-world容器(由镜像生成),该容器在显示其消息后退出。如果它还在运行,您就不需要—all选项:
    docker container ls --all
    

完整卸载Docker CE

  1. 卸载Docker CE包:
    $ sudo apt-get purge docker-ce
    
  2. 卸载Docker CE包:
    主机上的镜像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
    $ sudo rm -rf /var/lib/docker
    
    注意:您必须手动删除任何已编辑的配置文件。

Part2 容器(集装箱)

简介

是时候开始以Docker的方式构建应用程序了。我们从这类应用程序的层次结构的底部开始,即这个页面所涵盖的容器。在这个级别之上是一个服务,它定义了容器在生产中的行为,将在第3部分中介绍。最后,在顶层是堆栈,定义第5部分中介绍的所有服务的交互。
· Stack
· Services
· Container (你在这里)

新的开发环境

在过去,如果要开始编写Python应用程序,首先要做的就是在及其上安装Python运行。但是,这就造成了这样一种情况:你的机器上的环境需要完美,以便你的应用程序能够按照预期运行,而且还需要与你的生产环境相匹配。

使用Docker,你只需要获取一个可移植的Python运行时作为镜像,不需要安装。然后,你的构建可以在应用程序代码旁边包含基本的Python镜像,确保应用程序、它的依赖项和运行时一起运行。这些可移植的镜像由Dockerfile定义。

用Dockerfile定义一个容器

Dockerfile定义容器内的环境中发生了什么。对网络接口和磁盘驱动器等资源的访问时在此环境中虚拟化的,该环境与系统的其他部分是隔离的,因此需要将端口映射到外部世界,并制定要哪些文件“复制”到该环境。在这样做之后,你可以期望在这个Dockerfile中定义的应用程序的构建无论在哪里运行,其行为都完全相同。

Dockerfile

在本地计算机上创建一个空目录。将目录(cd)更改为新目录,创建一个名为Dockerfile的文件,将以下内容复制并粘贴到该文件中,然后保存。请注意解释新Dockerfile中的每个语句的注释。

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

这个Dockerfile引用了两个我们还没有创建的文件,即app.py和requirements.txt。接下来创建这些。

应用程序本身

创建另外两个文件requirements.txt和app.py,并将它们与Dockerfile放在同一个文件夹中。这就完成了我们的应用程序,正如你看到的,它非常简单。当将上面的Dockerfile构建到一个镜像中时,由于Dockerfile的COPY命令,出现了app.py和requirements.txt,并且由于EXPOSE命令,可以通过HTTP访问来自app.py的输出。

requirements.txt

Flask
Reids

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

现在我们看到 pip install -r requirement.txt 安装了用于Python的Flask和Redis库,应用程序打印环境变量名以及对socket.gethostname()的调用的输出。最后,因为Redis没有运行(因为我们只安装了Python库,而没有安装Redis本身),所以我们应该预期在这里使用它的尝试会失败并产生错误消息。

注意:在容器中检索容器ID时访问主机名,这与正在运行的可执行文件的进程ID类似。

你的系统上不需要Python或requirements.txt中的任何东西,构建或运行此镜像也不需要在系统上安装它们。看起来你并没有真正使用Python和Flask建立一个环境,但是你已经这样做了。

构建应用程序

我们已经准备好构建应用程序。请确保你仍然位于新目录的顶层。下面是 ls 应该显示的内容:

ls
Dockerfile					app.py					requirements.txt

现在运行 build 命令。这将创建一个Docker镜像,我们将使用----tag选项为其命名。如果你想使用较短的选项,请使用-t。

docker build --tag=friendlyhello .

你建立的镜像在哪里?它在你的机器的本地Docker镜像注册表:

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

注意标签是如何默认为latest的。tag选项的完整与法应该类似于----tag=friendlyhello:v0.0.1。

Linux用户的故障排除

代理服务器设置
一旦web应用程序启动并运行,代理服务器就会阻塞到它的连接。如果你的代理服务器的后面,使用ENV命令制定代理服务器的主机和端口,将以下行添加到Dockerfile中:

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port

DNS 设置
DNS错误配置可能导致pip出现问题。你需要设置自己的DNS服务器地址,以使pip正常工作。你可能希望更改Docker守护进程的DNS设置。可以在/etc/docker/daemon.json上编辑(或创建)配置文件,使用dns秘钥,如下:

{
  "dns": ["your_dns_address", "8.8.8.8"]
}

在上面的例子中,列表的第一个元素是DNS服务器的地址。第二项是谷歌的DNS,当第一个DNS不可用时可以使用它。

在继续之前,保存守护进程。然后重启docker服务。

sudo service docker restart

修复后,重试运行build命令。

运行应用程序

运行应用程序,使用-p将机器的端口4000映射到容器的已发布端口80:

docker run -p 4000:80 friendlyhello

你应该会看到一条消息,说明Python正在http://0.0.0.0:80为你的应用程序提供服务。但是该消息来自容器内部,它不知道你讲该容器的80端口映射到4000,从而生成正确的URL:http://localhost:4000
在这里插入图片描述
转到web浏览器中的URL,查看web页面上提供的显示内容。
在这里插入图片描述

注意:如果你在Windows 7上使用Docker工具箱,请使用Docker机器IP而不是localhost。例如:http://192.168.99.100:4000。要查找IP地址,请使用命令docker-machine IP。

你还可以使用shell中的curl命令查看相同的内容。

$ curl http://localhost:4000

<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

在这里插入图片描述
这个端口映射为4000:80,演示了Dockerfile中的EXPOSE与运行docker run -p时设置的发布值之间的差异。在后面的步骤中,将主机上的端口4000映射到容器中的端口80,并使用http://localhost。

在终端中按CTRL+C退出。

在Windows上,显式地停止容器
在Windows系统上,CTRL+C不会停止容器。因此,首先键入CTRL+C来返回提示符(或打开另一个shell),然后键入docker container ls 来列出正在运行的容器,然后键入docker container stop <container NAME或ID>来停止容器。否则,当你尝试在下一步中重新运行容器时,守护进程将发出错误相应。

现在让我们在后台以分离模式运行应用程序:

docker run -d -p 4000:80 friendlyhello

你获得应用程序的长容器ID,然后被返回终端。你的容器在后台运行。你还可以看到带有docker容器ls的缩写容器ID(两者在运行命令时可以互换工作):

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED
1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

注意:容器ID匹配http://localhost:4000上的内容。现在使用docker容器stop结束进行,使用容器ID,如下所示:

docker container stop 1fa4ab2cf395

分享你的镜像

为了演示我们刚刚创建的东西的可移植性,让我们上传构建的镜像并在其他地方运行它。毕竟,当你想要将容器部署到生产环境中时,你需要知道如何推送到注册中心。

注册表是存储库的集合,而存储库是镜像的集合-----有点像GitHub存储库,只是代码已经构建好了。注册表上的账户可以创建许多存储库。docker CLI默认使用docker的公共注册表。

注意:我们在这里使用Docker的公共注册表,因为它是免费的,而且是预先配置的,但是有许多公共注册表可供选择,你甚至可以使用Docker Trusted registry设置自己的私有注册表。

使用Docker ID登录

如果你没有Docker账户,在hub.docker.com注册一个。记下你的用户名。
登录到本地计算机上的Docker公共注册表。

$ docker login

标记镜像

将本地镜像与注册表上的存储库关联的符号是 username/repository:tag。标记是可选的,但推荐使用它,因为注册中心使用它来为Docker镜像提供一个版本。为上下文提供存储库和标记有意义的名称,例如get-started:part2。这将镜像放入get-started存储库并将其标记为part2。

现在,把它们放在一起来标记镜像。使用用户名、存储库和标记名称运行docker标记镜像,以便将镜像上传到所需的目的地。该命令的语法为:

docker tag image username/repository:tag

例如:

docker tag friendlyhello gordon/get-started:part2

运行 docker image ls 查看新标记的镜像。

$ docker image ls

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
friendlyhello            latest              d9e555c53008        3 minutes ago       195MB
gordon/get-started         part2               d9e555c53008        3 minutes ago       195MB
python                   2.7-slim            1c7128a655f6        5 days ago          183MB
...

发布镜像

上传你的标记镜像到存储库:

docker push username/repository:tag

一旦完成,此上传的结果将公开可用。如果你登录到Docker Hub,你将在那里看到带有pull命令的新镜像。

从远处存储库拉出并运行镜像

从现在开始,你可以使用docker run,并运行你的应用程序在任何及其上与此命令:

docker run -p 4000:80 username/repository:tag

如果镜像在机器上本地不可用,Docker将从存储库中提取它。

$ docker run -p 4000:80 gordon/get-started:part2
Unable to find image 'gordon/get-started:part2' locally
part2: Pulling from gordon/get-started
10a267c67f42: Already exists
f68a39a6a5e4: Already exists
9beaffc0cf19: Already exists
3c1fe835fb6b: Already exists
4c9f1fa8fcb8: Already exists
ee7d8f576a14: Already exists
fbccdcced46e: Already exists
Digest: sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068
Status: Downloaded newer image for gordon/get-started:part2
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

无论docker run在何处执行,它都会从需求中提取你的镜像、Python和所有依赖项,并运行你的代码。它以一个简洁的小程序包的形式运行,你不需要在主机上安装任何东西就可以运行它。

未完待续…

安装Docker常见问题

dpkg:处理软件包 docker(–configure)时出错

(本问题博客转载自zhengbin1993
https://blog.csdn.net/u010426270/article/details/52028620)
当在安装(sudo apt-get install docker-ce docker-ce-cli containerd.io)时,出现以下错误:
dpkg: 处理软件包 docker:amd64 (–configure)时出错:

该软件包正处于非常不稳定的状态;

您最好在配置它之前,先重新安装它

正在设置 docker-ce(XXXXX) ...

在处理时有错误发生:

 XXXXXXXXX

E: Sub-process /usr/bin/dpkg returned an error code (1)

解决方法如下

1.将info文件夹更名

sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old

2再新建一个新的info文件夹

sudo mkdir /var/lib/dpkg/info

3.更新

sudo apt-get update
sudo apt-get -f install

4.执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下

sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old 

5.把自己新建的info文件夹删掉

sudo rm -rf /var/lib/dpkg/info

6.把以前的info文件夹重新改回名字

sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info 

7.重新执行安装命令
sudo apt-get install docker-ce docker-ce-cli containerd.io

这时就会看到安装成功的信息了

猜你喜欢

转载自blog.csdn.net/qq_42269354/article/details/88865392