【服务计算】Docker容器化技术与容器服务

安装docker

使用VMware来运行虚拟机,首先说明本虚拟机的配置如下:

  • 操作系统:Ubuntu 18.04

  • 内存:4GB

  • 硬盘:20GB

  • 处理器:4

docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

管理程序虚拟化和容器的区别在于,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。

docker具有占空间小,启动速度快,集成容易,便于携带等优点。

安装前准备

更新apt源

$ sudo apt-get update

apt安装依赖包

用于通过https来获取仓库。

$ sudo apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg-agent \
   software-properties-common

安装依赖包成功。
在这里插入图片描述

添加Docker官方GPG密钥

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

在这里插入图片描述

设置稳定版仓库

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

设置成功。
在这里插入图片描述

安装docker

首先需要再次更新apt源,命令同上。

sudo apt-get update

然后安装docker。使用如下命令安装docker-ce,会自动安装docker-ce-cli和containerd.io依赖。

sudo apt-get install docker-ce

在这里插入图片描述

验证安装成功

查看软件版本。
在这里插入图片描述
若要查看完整软件版本信息描述,可以使用如下命令,显示docker为20.10.1版本。

sudo docker version

在这里插入图片描述
如图所示,已经安装成功。

添加当前用户到用户组

查看当前用户组,若不是root用户,则需要加入当前用户。

# 列出自己的用户组,确认自己在不在 docker 组中
groups
# 没有则新增docker组
sudo groupadd docker
# 把当前用户加入到docker组中
sudo gpasswd -a ${USER} docker
# 重启docker服务
sudo service docker restart

在这里插入图片描述

docker的启动与停止

安装完成之后默认启动docker,若需停止可以使用如下命令。

# 启动docker
sudo service docker start
# 停止docker
sudo service docker stop
# 重启docker
sudo service docker restart

测试运行第一个容器hello-world

进行测试,验证是否安装成功。
出现如下输出说明安装成功。

sudo docker run hello-world

在这里插入图片描述

docker镜像基本操作

docker镜像

每一个docker容器必须对应一个docker镜像,而docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。docker容器启动是需要一些文件的,而这些文件就可以称为docker镜像。

显示本地镜像库内容

sudo docker images

在这里插入图片描述

搜索镜像

sudo docker search django

在这里插入图片描述

拉取并运行镜像

拉取镜像:

若要加快拉取速度,请更换docker register mirror镜像源。

换源方法:

首先,新建或更改文件daemon.json。

sudo gedit /etc/docker/daemon.json

输入以下内容:

{
      "registry-mirrors": ["https://y0qd3iq.mirror.aliyuncs.com"]
}

在这里插入图片描述

重启docker。

sudo service docker restart

验证配置是否生效。

sudo docker info|grep Mirrors -A 1

出现如下输出说明生效。

在这里插入图片描述

现在,接着进行拉取镜像的任务,速度显然加快了。

# django是镜像名
sudo docker pull django

在这里插入图片描述

运行镜像:

若镜像不存在会自动拉取镜像,并运行。如上述运行的hello-world,由输出可知,先拉取hello-world再运行。

sudo docker run hello-world

在这里插入图片描述

删除镜像

sudo docker image rm django

docker容器操作

创建容器

sudo docker run [option] [container name] [command]

#[option]可选参数
#-i 表示以“交互模式”运行容器。
#-t 表示容器启动后会进入其命令行。
#-p 表示将容器的 port1 端口映射到主机的 port2 端口。
#--name 为创建的容器命名。
#-e 为容器设置环境变量

在这里插入图片描述

如上图所示,创建了一个名为“create-container”的容器。

显示容器

显示运行中容器。

docker ps

显示所有容器。

docker ps -a

目前没有正在运行的容器。

在这里插入图片描述

运行、停止,和继续运行原容器。

# 运行
sudo docker container start create-container
# 停止
sudo docker container stop create-container
# 继续运行
docker restart [name]

在这里插入图片描述

进入容器

比如,进入mysql容器。

sudo docker exec -it [name] command

在这里插入图片描述

删除容器

sudo docker container rm create-container

容器列表中已经没有“create-container”容器,与上文形成对比。

在这里插入图片描述

镜像备份

通过save命令将镜像打包成文件,从而可以将镜像文件拷贝给他人使用。

sudo docker save -o hello-world.tar hello-world

在这里插入图片描述

得到镜像文件后,可以通过load命令,将镜像加载到本地。

sudo docker load -i ./hello-world.tar

部署mysql

拉取mysql镜像

sudo docker pull mysql

还可以在之后自定义镜像tag。

在这里插入图片描述

查看下载好的镜像。

sudo docker images|grep mysql

在这里插入图片描述

启动容器镜像

进入 /usr/local/workspace/mysql 目录下,执行以下docker run命令,通过镜像创建一个容器,启动容器镜像。

# 命令含义
# -p 15506:5506  # 将容器的15506端口映射到主机的5506端口
# --name zy-mysql    #命名容器为zy-mysql  
-e MYSQL_ROOT_PASSWORD=12345678  #初始化root用户的密码
-d mysql #指定使用的镜像为mysql

sudo docker run -p 15506:5506 --name zy-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

建议还可以在上述命令中加入一个参数选项。

# 将主机当前目录下的data目录挂载到容器的 /var/lib/mysql (data目录为mysql配置的数据文件存放路径,容器down掉,还能再次挂载数据。)

-v $PWD/data:/var/lib/mysql

在这里插入图片描述

mysql基本操作

查看容器运行情况

已经成功生成名为“zy-mysql”的容器。

在这里插入图片描述

构建docker镜像

新建文件夹和dockerfile文件。

mkdir mydock && cd mydock
gedit dockerfile

输入以下内容:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

构建并运行镜像。

# 构建
sudo docker build . -t hello
# 运行
sudo docker run -it --rm hello -H 

在这里插入图片描述

登录容器mysql

登录容器。

sudo docker exec -it zy-mysql bash

登录mysql。

mysql -uroot -p

在这里插入图片描述

进入交互式界面,进行各种mysql操作,如显示数据库。

在这里插入图片描述

至此,mysql的部署已经完成。

创建卷并挂载

sudo docker volume create mydb
sudo docker run --name mysql3 -e MYSQL_ROOT_PASSWORD=root -v mydb:/var/lib/mysql -d mysql

在这里插入图片描述

注意这里没有暴露端口到主机,需要将自己定义的数据卷挂载在 /var/lib/mysql,只需要在原命令基础上加上下面的参数即可。

# 将主机当前目录下的data目录挂载到容器的 /var/lib/mysql (data目录为mysql配置的数据文件存放路径,容器down掉,还能再次挂载数据。)

-v $PWD/data:/var/lib/mysql

在这里插入图片描述

启动客户端容器链接服务器

sudo docker run --name myclient --link mysql2:mysql -it mysql bash
root@768d01904d4e:/# env
…
root@768d01904d4e:/# mysql -hmysql -P3306 -uroot -proot

管理容器网络处理

容器网络基本类型

  • 容器默认使用网络:Docker0(桥接)
  • 容器支持网络与类型 – bridge (本机内网络) – host (主机网卡) – overlay (跨主机网络) – none – Custom(网络插件)
docker网络模式配置说明
host模式–net=host容器和宿主机共享Network namespace。
container模式–net=container:NAME_or_ID容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
none模式–net=none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
bridge模式–net=bridge默认该模式

host模式

  • 如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
  • 使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

container模式

  • 这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

none模式

使用none模式,docker容器拥有自己的Network Namespace,但是,并不为docker容器进行任何网络配置。也就是说,这个docker容器没有网卡、IP、路由等信息。需要我们自己为docker容器添加网卡、配置IP等。

  • 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

bridge模式

  • docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  • docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,dockerveth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
  • bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

容器网络处理

查看容器网络

sudo docker network ls

在这里插入图片描述

备制支持 ifconfig 和 ping 命令的 ubuntu 容器

运行Ubuntu容器。

sudo docker run --name unet -it --rm ubuntu bash

在交互式界面依次输入以下命令,apt安装network操作的必备工具和依赖包。

apt-get update
apt-get install net-tools
apt-get install iputils-ping -y

在这里插入图片描述

安装软件包的过程:

在这里插入图片描述

验证可以成功使用ifconfig和ping命令。

在这里插入图片描述

由容器制作镜像

需要打开另一个终端窗口,输入以下命令。

sudo docker commit unet ubuntu:net

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ky0dUjZs-1609268862386)(C:\Users\Zhy0911\AppData\Roaming\Typora\typora-user-images\image-20201230013723645.png)]

查看生成的镜像,生成了tag为net的ubuntu镜像。

在这里插入图片描述

创建自定义网络

sudo docker network create mynet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySaeL3Un-1609268862389)(C:\Users\Zhy0911\AppData\Roaming\Typora\typora-user-images\image-20201230014347185.png)]

Golang应用容器化

拉取scratch镜像

使用gin框架的Golang web项目为例进行部署。

新建一个名为“night-talk”的文件夹,进入该目录,新建一个Dockerfile,写入以下内容。

FROM scratch
 
WORKDIR ./night-talk
COPY . ./night-talk
 
EXPOSE 8000
CMD ["./night-talk"]

scratch镜像远远小于golang镜像的大小,基本是个空镜像,节省系统空间。

构建镜像

构建镜像,在项目的根目录下执行命令。

sudo docker build -t night-talk-docker .

在这里插入图片描述

由上图可知,通过该命令成功构建了一个night-talk镜像,接下来就可以通过镜像创建容器执行了,步骤方法以及命令参考上文的操作即可。

volumn挂载

docker容器提供volume数据卷的方式,可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据,或者当容器意外删除的时候,宿主机的数据仍然有一份,便于容灾。

使用方法

# hostFile表示宿主机的目录或文件,需要提前存在的
# containerFile表示容器的目录或文件,运行容器时会自动创建
# 如果没有指定hostFile,即命令如果为 -v containerFile 则宿主机的默认目录为 /var/lib/docker/volumes/ 下,具体的映射关系可以使用命令查看 docker inspect [容器名称]|grep /var/lib/docker/volumes

-v hostFile:containerFile

实现挂载

挂载文件

进入/usr/local目录下,新建test.txt文件。

在这里插入图片描述

我选择使用hello-world,挂载宿主机文件到容器文件上。

sudo docker run -d --name my-hello -v /usr/local/test.txt:/usr/local/test.txt hello-world

在这里插入图片描述

成功将宿主机的/usr/local/test.txt文件挂载到容器的/usr/local/目录下,在宿主机外面改变该文件内容并不会影响容器内对应的文件。

挂载目录

挂载目录的方式和挂载文件一致,此处我选择新建一个test目录,里面放置test.txt文件,按照上述方法同理对目录挂载,此处不再赘述。

sudo docker run -d --name my-hello -v /usr/local/test:/usr/local/test hello-world

挂载完成后,进入容器中,查看文件目录,发现与外部一致,说明挂载成功。

在这里插入图片描述

删除数据卷

docker要求我们手动删除不需要的数据卷。

#列出所有的数据卷
$ docker volume ls     
#过滤不在使用的数据卷
$ docker volume ls --filter dangling=true
#删除一个数据卷,容器正在使用的数据卷不能删除,绑定挂载的数据卷无法删除
$ docker volume rm [volume name]   

容器监控与与日志

容器信息监控

sudo docker info 

在这里插入图片描述

sudo docker info --format {{.ServerVersion}}

在这里插入图片描述

查看日志

日志能帮助我们调试和分析。

若要查看某容器的日志,则先列出其id,再使用如下命令查看日志。

sudo docker logs [container id]

在这里插入图片描述

docker图形化管理工具

使用web图形化管理工具 – Portainer。

单节点运行

sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

在这里插入图片描述
在浏览器中打开如下网址:

http://127.0.0.1:9000/

打开web网页

进入web的图形化管理界面,对容器进行GUI管理。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值