从0到1搭建Docker容器,这篇就够了

首先要确保open Euler操作系统里没有docker安装记录,如之前安装过docker先按照下方过程卸载干净。注意:本操作只会删除docker本身,但老版本保存在/var/lib/docker/的内容,包括镜像、容器、卷和网络需要手动删除。

1、清除残留docker

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

2、安装Docker依赖包

Docker 是一种流行的开源容器化平台,它能够将应用程序与其依赖项打包成可移植的容器,从而简化了应用程序的部署和管理。本文将介绍在 OpenEuler 系统中安装 Docker 容器的具体步骤;

sudo dnf install -y dnf-utils device-mapper-persistent-data lvm2 --skip-broken fuse-overlayfs wget  
# dnf-utils 里包含更换yum源所需的yum-config-manager这套工具包
# device-mapper-persistent-data lvm2 --skip-broken fuse-overlayfs wget # 安装Docker环境所需要的以来包

3、添加Docker的yum源

通过如下命令下载docker的yum源后不能直接更新yum列表否则会报错,因为目前各大镜像站好没有同步完open Euler相关目录,下面命令下载的是针对centos操作系统对应的源,因此下载完成后用vim工具对repo文件中URL对应的$releasever更为内核相近的centos版本,这里改成了9否则通过环境变量直接提取为open Euler的版本,而centos没有对应版本的目录。导致yum源更新失败。centos8系列因生命周期结束不在维护原因导致更新yum列表失败

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
vim /etc/yum.repo.d/docker-ce.repo # $releasever环境变量值改成9.

更改后如下图

image-20240125174755553

image-20240124161738582

4、安装Docker-CE

sudo dnf install -y docker-ce

这将会安装最新版本的 Docker CE。如果需要安装特定版本的 Docker CE,可以执行类似以下的命令:

sudo dnf install -y docker-ce-<VERSION_STRING>

其中,<VERSION_STRING> 是指需要安装的 Docker CE 版本字符串,例如 20.10.6-3.el8

5、更换Docker仓库源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://s6hiwsn1.mirror.aliyuncs.com"]
}
EOF

6、启动 Docker 服务:

sudo systemctl start docker

7、验证是否安装成功:

sudo docker pull hello-word #下载镜像
sudo docker run hello-world #运行容器

本应该是Docker 安装成功,你将会看到一些输出信息,表示 Docker 已经运行,并且能够成功运行容器,但是我通过此方式验证失败,以为Docker的部署有问题,我又怀着不太可能的侥幸心重新拉取了nginx的镜像测试结果一切正常。hello-world镜像很可能跟源有关。

image-20240124163619658

image-20240124170521611

8、镜像操作示例

一个仓库会包含同一个软件不同版本的镜像,镜像名称一般分两部分组成:[仓库名]:[标签],如果不给出标签,将以 latest 作为默认标签 如:redis:6.0

image-20240124171418482

 

访问DockerHub搜索镜像,https://hub.docker.com/ 注:现在很难访问
docker pull redis # 搜索redis 拉取镜像:
docker images # 查看本地镜像:
docker save -o 文件名称 镜像名称/ID # 将镜像导出到磁盘:
docker rmi 镜像名称/ID # 删除本地镜像:
docker load -i 文件名称 # 导入本地镜像,应在镜像所在的目录下执行或指定具体目录

9、容器操作示例

docker run # 新建并启动容器
docker start/stop/pause/unpause # 启动/停止/暂停/恢复容器
docker exec # 进入容器执行命令
docker logs # 查看容器运行日志
docker ps # 查看容器的状态
docker rm # 删除指定容器

10、Nginx容器示例

docker pull nginx # 拉取nginx镜像 it
docker run --name mynginx -itd -p 80:80 nginx nginx:latest #创建并运行镜像
socker stop mynginx # 停止运行mynginx容器
socker start mynginx # 启动运行mynginx容器
docker exec -it mynginx bash # 以交互方式进入mynginx容器,并给出bash
# run创建并启动容器,
# --name为指定容器名称
# -p为将宿主机端口与容器端口映射
# -d为后台运行容器
# nginx:latest 基于的镜像:版本号
# -it 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
# bash进入容器后执行的命令

11、关于容器的数据卷

一个容器运行了一段时间,肯定会产生一些数据,比如日志、数据库数据、新改的配置文件等等,如果这些数据文件存放在容器中,当我们删除容器时,这些数据也会被随之删除。 为此在docker中,提供了一种存储数据的方法,叫做“数据卷”,可以达到数据共享的目的。

数据卷基本概念 我们可以把“数据卷”Data Volumes理解成“宿主机中的目录”,当把某个卷和容器中的某个目录建立映射关系后,就相当于把宿主机中的某个目录和容器中的某个目录建立了映射关系。

image-20240125094802384

数据卷基本概念 数据卷提供了很多有用的特性

# 数据卷可以在容器之间共享和重用
# 容器间传递数据将变得高效与方便
# 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
# 对数据卷的更新不会影响镜像,解耦开应用和数据;
# 卷会一直存在,直到没有容器使用,可以安全地卸载它。

数据卷操作命令 数据卷操作的基本语法为:

docker volume [COMMAND] # 其中COMMAND可选值
create:创建一个volume
inspect:显示一个或多个volume的信息
ls:列出所有的volume
prune:删除未使用的volume
rm:删除一个或多个指定的volume

数据卷操作示例 n 创建数据卷:

docker volume create testA # 创建一个名为testA的数据卷 
docker volume ls # 查看数据卷
docker volume inspect testA # 查看对应卷testA的详细信息
# 在linux的docker主机中创建一个卷时,其在宿主机对应的目录(挂载点)路径为/var/lib/docker/volumes/卷名/_data

挂载卷

在创建容器时,可以通过–volume或 -v 参数挂载一个数据卷到某个容器目录

docker run --name test  -v testA:/data -d nginx
#上述命令表示创建一个名为test的容器,将testA卷映射到test容器的/data目录中;注意:如果卷映射的目录在容器中不存在时,会自动在容器中创建对应的目录
docker run --name test -v testA:/data -v testB:/var/log -d nginx
#一个容器可以使用多个卷,只需要多次使用-v选项指定即可,当指定的卷不存在时,docker会自动创建对应的卷,上述命令中的testB数据卷会被自动创建

绑定挂载

前面创建的数据卷都存放在/var/lib/docker/volumes目录中,这个目录是固定的,它们都能被docker volume命令管理。 还有一种映射宿主机目录的方法,这种方法被称之为”绑定挂载”,绑定挂载能够将指定的宿主机目录挂载到容器中,只需要将卷名替换成宿主机上的目录路径即可。

docker run -d --name testAcon -v /root/test1:/data1 nginx
# 上述命令将宿主机的/root/test1目录映射到容器的/data1目录中,绑定挂载不会生成任何卷,它直接将指定的宿主机目录映射到容器中,所以,docker volume命令无法查看或管理到绑定挂载的路径

官方建议使用卷,而不是绑定挂载,但是,绑定挂载有一个优势,就是绑定挂载可以直接将宿主机中的文件(非目录)直接挂载到容器中,比如,将宿主机中的/etc/localtime文件映射到容器中的/etc/localtime文件。

docker run -d --name test -v /etc/localtime:/etc/localtime nginx 
# 通常,使用绑定挂载就是为了将宿主机中的配置文件挂载到容器中,如果是整个目录的数据,建议使用卷,卷只能映射目录,不能映射文件。

nginx示例

docker run --name myng -v html:/usr/share/nginx/html -p 80:80 -d nginx
# 创建容器并挂载数据卷到容器内的HTML目录
cd /var/lib/docker/volumes/html/_data
# 进入html数据卷所在位置,并修改HTML内容

12、关于docker镜像的打包

要将已有的二进制应用打包至 CentOS 的 Docker 镜像中,你可以按照以下步骤进行:

  1. 准备 Dockerfile:创建一个名为 Dockerfile 的文本文件,并在其中编写构建镜像所需的指令。一个简单的 Dockerfile 可能如下所示:

# 使用官方 CentOS 镜像作为基础
FROM centos:7

# 将二进制文件复制到镜像中的指定位置
COPY your-binary-file /usr/local/bin/your-binary-file

# 设置容器启动时执行的默认命令
CMD ["/fsmeeting/live-cdn/monitor_ctrl.sh"]
CMD ["/fsmeeting/another-startup-script.sh"]

在上面的示例中,假设你的二进制文件名为 your-binary-file

  1. 构建镜像:在包含 Dockerfile 的目录中打开终端,执行以下命令来构建镜像:

docker build -t your-image-name .

其中,your-image-name 是你为镜像指定的名称,可以根据实际情况进行修改。

  1. 验证镜像:构建完成后,可以使用以下命令来验证镜像是否成功创建:

docker images

这将列出所有本地镜像,你应该能够看到刚刚创建的镜像。

通过上述步骤,你就可以将已有的二进制应用打包至 CentOS 的 Docker 镜像中。这个镜像中将包含你的二进制应用,并且可以直接在容器中运行。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容