运行Docker容器

运行Docker容器

Docker是一种容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个称为容器的独立运行环境中。这样的容器可以在任何支持Docker的环境中运行,而不需要额外的配置。

Docker的优点:

  1. 轻量级:Docker容器与虚拟机相比更为轻量级,因为它们共享主机系统的内核,避免了额外的资源消耗。

  2. 一致性:由于Docker容器包含了应用程序及其所有依赖项,因此在不同的环境中运行时,可以保持一致性。

  3. 可移植性:Docker容器可以在任何支持Docker的环境中运行,无需修改代码,这使得应用程序更易于部署和移植。

  4. 快速启动:Docker容器的启动速度非常快,因为它们不需要像虚拟机那样启动整个操作系统。

  5. 灵活性:Docker容器可以轻松地进行扩展和缩减,以适应应用程序的需求。

  6. 资源隔离:Docker容器提供了资源隔离,可以限制容器对系统资源的访问,提高了安全性。

  7. 版本控制:Docker容器的镜像可以进行版本控制,方便管理和回滚。

Docker的缺点:

  1. 不适用于GUI应用:Docker主要用于部署和运行后端服务,对于需要图形用户界面的应用支持不够。

  2. 性能损耗:与直接在主机上运行应用程序相比,Docker容器可能会有一定的性能损耗,尤其是在I/O密集型应用上。

  3. 安全性风险:如果不正确地配置Docker容器,可能会存在安全隐患,例如容器逃逸、未经授权的访问等问题。

  4. 学习曲线:Docker有一定的学习曲线,特别是对于初学者来说,需要学习Docker的概念和命令行工具。

  5. 持久化数据管理:在Docker中管理持久化数据可能会有一些挑战,例如容器重启后数据的保留和恢复。

尽管Docker存在一些缺点,但其优点远远超过了缺点,因此Docker在现代软件开发和部署中被广泛采用。

安装Docker
安装环境如下表所示
系统版本 IP地址 内存 处理器 主机名
Centos7.9 192.168.132.167/24 2Gib 2vCPU docker-master
操作过程
1、初始化操作

查看系统版本

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

配置主机名

[root@localhost ~]# hostnamectl set-hostname docker-master && bash
[root@docker-master ~]# 

关闭Firewalld防火墙服务并禁止开机自启

[root@docker-master ~]# systemctl stop firewalld.service
[root@docker-master ~]# systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

安装iptables防火墙,随后关闭服务并禁止开机自启

[root@docker-master ~]# yum -y install iptables-services.x86_64
[root@docker-master ~]# systemctl stop iptables
[root@docker-master ~]# systemctl disable iptables

清空iptables防火墙规则

[root@docker-master ~]# iptables -F

关闭selinux,修改配置文件/etc/selinux/config后,需重启才能生效

[root@docker-master ~]# setenforce 0
[root@docker-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
[root@docker-master ~]# getenforce 
[root@docker-master ~]# cat /etc/selinux/config | grep SELINUX= | grep -v '#'
SELINUX=disabled

配置时间同步

[root@docker-master ~]# yum -y install ntp ntpdate
[root@docker-master ~]# ntpdate cn.pool.ntp.org
22 Apr 04:26:10 ntpdate[16663]: adjust time server 84.16.73.33 offset 0.040075 sec

编写计划任务,每隔一小时同步系统时间,并重启crond服务使配置生效

[root@docker-master ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate   cn.pool.ntp.org
[root@docker-master ~]# systemctl restart crond

安装基础软件包

[root@docker-master ~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack
2、安装docker-ce

安装必要的一些系统工具

[root@docker-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

配置docker-ce国内仓库源

[root@docker-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker-ce

[root@docker-master ~]# yum -y install docker-ce

启动docker服务,并设置为开机自启,查看服务运行状态

[root@docker-master ~]# systemctl start docker && systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@docker-master ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-04-22 04:45:49 EDT; 15s ago
     Docs: https://docs.docker.com
 Main PID: 17572 (dockerd)
   CGroup: /system.slice/docker.service
           └─17572 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Apr 22 04:45:48 docker-master systemd[1]: Starting Docker Application Container Engine...
Apr 22 04:45:48 docker-master dockerd[17572]: time="2024-04-22T04:45:48.550495429-04:00" level=info msg="Starting up"
Apr 22 04:45:48 docker-master dockerd[17572]: time="2024-04-22T04:45:48.620522061-04:00" level=info msg="Loading containers: start."
Apr 22 04:45:48 docker-master dockerd[17572]: time="2024-04-22T04:45:48.916020938-04:00" level=info msg="Loading containers: done."
Apr 22 04:45:48 docker-master dockerd[17572]: time="2024-04-22T04:45:48.936072463-04:00" level=info msg="Docker daemon" commit=7cef0d9 containerd-snapshotter=f...ion=26.0.2
Apr 22 04:45:48 docker-master dockerd[17572]: time="2024-04-22T04:45:48.936309663-04:00" level=info msg="Daemon has completed initialization"
Apr 22 04:45:49 docker-master systemd[1]: Started Docker Application Container Engine.
Apr 22 04:45:49 docker-master dockerd[17572]: time="2024-04-22T04:45:49.014677813-04:00" level=info msg="API listen on /run/docker.sock"
Hint: Some lines were ellipsized, use -l to show in full.

查看docker版本信息

[root@docker-master ~]# docker version
Client: Docker Engine - Community
 Version:           26.0.2
 API version:       1.45
 Go version:        go1.21.9
 Git commit:        3c863ff
 Built:             Thu Apr 18 16:30:00 2024
 OS/Arch:           linux/amd64
 Context:           default
3、网络配置

将 Linux 系统作为路由或者 VPN 服务就必须要开启 IP 转发功能。当 linux 主机有多个网卡时一个网卡收 到的信息是否能够传递给其他的网卡 ,如果设置成 1 的话 可以进行数据包转发,可以实现 VxLAN 等功 能。不开启会导致 docker 部署应用无法访问。

开启包转发功能和修改内核参数,br_netfilter 模块用于将桥接流量转发至 iptables 链,br_netfilter 内核参数需要开启转发。

[root@docker-master ~]# modprobe br_netfilter
[root@docker-master ~]# cat > /etc/sysctl.d/docker.conf <<EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF

sysctl命令动态修改内核运行参数

[root@docker-master ~]# sysctl -p /etc/sysctl.d/docker.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

由于重启后模块会失效,编写开机自动加载模块脚本

[root@docker-master etc]# vim /etc/rc.sysinit 
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules;
do
    [ -x $file ] && $file
done
[root@docker-master ~]# chmod +x /etc/rc.sysinit

在/etc/sysconfig/modules/目录下新建br_netfilter.modules文件,并写入需加载的模块

[root@docker-master ~]# cat /etc/sysconfig/modules/br_netfilter.modules 
modprobe br_netfilter

赋予文件执行权限

[root@docker-master ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

查看当前内核加载的模块(也可在重启后执行该命令,验证脚本执行结果)

[root@docker-master ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

重启docker服务

[root@docker-master ~]# systemctl restart docker
4、docker配置

配置docker镜像加速器,需登录阿里云,查找容器镜像服务。网页内会给予操作提示。读者可以在daemon.json文件内添加多个加速源。

阿里云镜像加速器

修改/etc/docker/daemon.json文件

[root@docker-master ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://wr3obfzf.mirror.aliyuncs.com"]
> }
> EOF

重新加载配置文件,重启docker服务

[root@docker-master ~]# systemctl daemon-reload 
[root@docker-master ~]# systemctl restart docker
docker的基本用法

从dockerhub查找镜像

[root@docker-master ~]# docker search centos
NAME                               DESCRIPTION                                     STARS     OFFICIAL
centos                             DEPRECATED; The official build of CentOS.       7721      [OK]
kasmweb/centos-7-desktop           CentOS 7 desktop for Kasm Workspaces            43        
bitnami/centos-base-buildpack      Centos base compilation image                   0         
dokken/centos-7                    CentOS 7 image for kitchen-dokken               10        
spack/centos7                      CentOS 7 with Spack preinstalled                2     

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

下载镜像

[root@docker-master ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

查看本地镜像

[root@docker-master ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   2 years ago   231MB

将镜像保存为离线压缩包

[root@docker-master ~]# docker save -o centos.tar.gz centos
[root@docker-master ~]# ls
anaconda-ks.cfg  centos.tar.gz

解压离线镜像包

[root@docker-master ~]# docker load -i centos.tar.gz
Loaded image: centos:latest

删除镜像

[root@docker-master ~]# docker rmi -f centos:latest
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
[root@docker-master ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE