部署Docker玩转Docker

Docker部署

文章目录

资源列表

操作系统 配置 主机名 IP
CentOS 7.9 2C4G docker 192.168.93.101

基础环境

  • 关闭防火墙
shell 复制代码
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
shell 复制代码
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
  • 修改主机名
shell 复制代码
hostnamectl set-hostname docker

一、安装最新版Docker依赖环境

shell 复制代码
# 安装依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加CentOS官方镜像站
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum clean all && yum makecache
# 安装Docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动Docker
systemctl start docker
systemctl enable docker

二、配置Docker加速器

shell 复制代码
cd /etc/docker/
cat >> daemon.json << EOF
{  
"registry-mirrors": ["https://8xpk5wnt.mirror.aliyuncs.com"]  
}
EOF
systemctl restart docker

三、查看Docker版本

shell 复制代码
[root@docker-01 ~]# docker version
Client: Docker Engine - Community
 Version:           26.1.2
 API version:       1.45
 Go version:        go1.21.10
 Git commit:        211e74b
 Built:             Wed May  8 14:01:02 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.2
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.10
  Git commit:       ef1912d
  Built:            Wed May  8 13:59:55 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.31
  GitCommit:        e377cd56a71523140ca6ae87e30244719194a521
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

四、Docker镜像操作

  • 运行docker容器前需要本地存在对应的镜像。如果不存在本地镜像,docker就会尝试从默认镜像仓库下载。镜像仓库是由docker官方维护的一个公共仓库,额可以满足用户的绝大部分需求。用户也可以通过配置来使用自定义的镜像仓库

4.1、搜索镜像

  • 命令格式:docker search 关键字
shell 复制代码
# 搜索nginx镜像
[root@docker-01 ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL
nginx                                             Official build of Nginx.                        19821     [OK]
## 部分内容省略
# 回显含义如下
NAME:镜像名称
DESCRIPTION:描述
STARS:星级
OFFICIAL:是否官方创建 [OK]字样表示官方创建

4.2、获取镜像

  • 命令格式:docker pull 仓库名称:[标签]
shell 复制代码
# 如果下载镜像时,不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签

# 下载最新的nginx镜像
[root@docker-01 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
b0a0cf830b12: Pull complete 
4d84de5fb9b2: Pull complete 
2818b7b6a9db: Pull complete 
1e5314d67f16: Pull complete 
8066e07ce4f2: Pull complete 
05f7109fea9e: Pull complete 
e58cbd904f7f: Pull complete 
Digest: sha256:32e76d4f34f80e479964a0fbd4c5b4f6967b5322c8d004e9cf0cb81c93510766
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

# 镜像文件是由若干层(Layer)组成,称之为AUFS(联合文件系统)

4.3、查看镜像信息

  • docker images 仓库名称:[标签]
shell 复制代码
[root@docker-01 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    1d668e06f1e5   7 days ago   188MB

# 回显含义如下
REPOSITORY:镜像属于的仓库
TAG:镜像的标签信息,标记同一个仓库中的不同镜像
IMAGE ID:镜像的唯一ID号,唯一标识一个镜像
CREATED:镜像创建时间
SIZE:镜像大小
  • 用户还可以根据镜像的唯一标识ID号,获取镜像详细信息
  • 命令格式:docker inspect 镜像ID号
shell 复制代码
[root@docker-01 ~]# docker inspect 1d668e06f1e5
[
    {
        "Id": "sha256:1d668e06f1e534ab338404ba891c37d618dd53c9073dcdd4ebde82aa7643f83f",
        "RepoTags": [
            "nginx:latest"
        ],

4.4、给镜像打标签

  • 命令格式:docker tag 源镜像名称:[标签] 新镜像名称[标签]
shell 复制代码
[root@docker-01 ~]# docker tag nginx:latest nginx_test:1.0
[root@docker-01 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    1d668e06f1e5   7 days ago   188MB
nginx_test   1.0       1d668e06f1e5   7 days ago   188MB

4.5、删除镜像

  • docker删除镜像的操作有两种方法:使用镜像的标签删除镜像、使用镜像的ID删除镜像
  • 命令格式:docker rmi 仓库名称:标签 或者 docker rmi 镜像ID号
shell 复制代码
# 例如删除掉刚刚打的新标签nginx_test:1.0
[root@docker-01 ~]# docker rmi nginx_test:1.0
Untagged: nginx_test:1.0


# 当使用docker rmi 命令后面制定了某个镜像ID时,必须确保该镜像当前没有被任一容器使用才能进行删除,系统会先删除掉所有指定该镜像的所有标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再次删除镜像

4.6、存出镜像和载入镜像

  • 当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存为本地文件,这一过程叫做存储镜像,可以使用docker save命令进行存储操作,之后就可以拷贝该文件到其他机器
4.6.1、存出镜像
  • 命令格式:docker save -o 存储文件名称 存储的镜像名称
shell 复制代码
# 例如:将本地nginx镜像存出
[root@docker-01 ~]# docker save -o nginx_latest.tar nginx:latest


# 存出镜像后就可以使用scp命令将存出的文件复制到其他机器上了
4.6.2、载入镜像
  • 命令格式:load < 存出的文件 或者 docker load -i 存储的文件
shell 复制代码
# 两种方式任选一个
[root@docker-02 ~]# docker load < nginx_latest.tar 
[root@docker-02 ~]# docker load -i nginx_latest.tar 

五、Docker容器操作

  • 容器是docker的另一个核心概念。简单说,容器是镜像的一个运行实例,是独立运行的一个或者一组应用以及他们所必须的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板添加一个额外的可写层

5.1、容器的创建

  • 命令格式:docker create [选项] 镜像 运行的程序
shell 复制代码
# 常用选项
-i:让容器的输入保持打开
-t:让docker分配一个伪终端
--name:指定容器的名称,如果不加的话容器名称是随机生成的
[root@docker-01 ~]# docker create -it --name myname nginx:latest bash
3cbd2bbf3cb0dddc7c8edd8730723d491606509587e7b6811a951dff16197262

# 使用docker create命令创建新的容器后会返回一个唯一的ID。可以使用docker ps命令查看所有容器的运行状态。添加-a选项可以显示所有的容器。包括为运行的
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS    PORTS     NAMES
3cbd2bbf3cb0   nginx:latest   "/docker-entrypoint...."   About a minute ago   Created             myname

# 回显含义如下
CONTAINER ID:容器的ID
IMAGE:加载的镜像
COMMAND:运行的程序
CREATED:创建容器的时间
STATUS:目前容器所处的状态
PORTS:端口映射
NAMES:容器的名称

5.2、启动、停止容器、创建并启动容器

5.2.1、启动容器
  • 命令格式:docker start 容器名称
shell 复制代码
[root@docker-01 ~]# docker start myname
myname
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS     NAMES
3cbd2bbf3cb0   nginx:latest   "/docker-entrypoint...."   6 minutes ago   Up 11 seconds   80/tcp    myname

# 启动容器后,STATUS状态变成了UP状态,表示容器已经处于启动状态
5.2.2、创建并启动容器
  • 注意:容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器退出

  • 命令格式:docker run

shell 复制代码
# 当利用docker run来创建容器时,docker在后台的标准运行过程是
1.检查本地是否存在指定的镜像。当镜像不存在时,会从公共仓库下载
2.利用镜像创建并启动一个容器
3.分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层
4.从宿主机主机配置的往前接口中桥接一个虚拟机接口到容器中
5.分配一个地址池中的IP地址给容器
6.指定用户指定的应用程序,指定完毕后容器被终止运行

# 例如:创建容器并启动执行一条shell命令
[root@docker-01 ~]# docker run centos:7.6.1810 bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 执行一下命令可以看出容器在执行"/usr/bin/bash -c ls"命令之后就停止了,有时候需要在后台持续的运行这个容器,就需要让docker容器以守护形式在后台运行。可以在docker run 命令之后添加-d选项来实现。但是需要注意容器所运行的程序不能结束,容器执行的命令一旦借宿那么容器也就推出了
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                      PORTS     NAMES
6a3739391e27   centos:7.6.1810   "bash -c ls /"           30 seconds ago   Exited (0) 28 seconds ago             mystifying_euler
3cbd2bbf3cb0   nginx:latest      "/docker-entrypoint...."   15 minutes ago   Up 10 minutes               80/tcp    myname




# 例如:下面的容器会在后台运行30秒后终止
[root@docker-01 ~]# docker run -itd centos:7.6.1810 bash -c "sleep 30"
1d414b78bbe5ba48b466dba497f7b9645d45f302c946fda7376be18c96f562ef
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                     PORTS     NAMES
1d414b78bbe5   centos:7.6.1810   "bash -c 'sleep 30'"     13 seconds ago   Up 12 seconds                        clever_haibt



# 例如:下面的容器会一直运行
[root@docker-01 ~]# docker run -itd centos:7.6.1810 bash -c "while true;do echo hello;done"
88b7043a5b75ad0f3ce1ed60f591a52a79c4ce4f4fe97f30fa23b7ebc498bec2
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                          PORTS     NAMES
88b7043a5b75   centos:7.6.1810   "bash -c 'while true..."   11 seconds ago   Up 10 seconds                             hopeful_black



# 创建容器的时候可以根据需求添加一些选项,常用的选项有
--rm:容器退出时自动删除容器
--name:指定容器的名字
-p:8080:80将宿主机的8080端口映射到容器的80端口(也就意味着如果访问虚拟机的8080端口就相当于访问容器的80端口)
-P:随机映射端口号
[root@docker-01 ~]# docker run -d --rm --name mynginx -P nginx:latest
f0e99cfa10c1ae1c77bb6600ea5945583d24c89393d24f6ac05523d146118a81
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                       PORTS                                     NAMES
f0e99cfa10c1   nginx:latest      "/docker-entrypoint...."   17 seconds ago   Up 16 seconds                0.0.0.0:32768->80/tcp, :::32768->80/tcp   mynginx


[root@docker-01 ~]# docker run -d --rm --name myningx_01 -p 8080:80 nginx:latest
d135e4786cff67951cfea1666424b91f29298ad53b7e92efa42560ce1e88a2f5
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS                       PORTS                                     NAMES
d135e4786cff   nginx:latest      "/docker-entrypoint...."   10 seconds ago       Up 9 seconds                 0.0.0.0:8080->80/tcp, :::8080->80/tcp     myningx_01



# 查看容器端口转发情况
[root@docker-01 ~]# docker port a07b19ffc4b1
80/tcp -> 0.0.0.0:85
80/tcp -> [::]:85
5.2.3、终止容器
  • 命令格式:docker stop 容器的ID/名称
shell 复制代码
[root@docker-01 ~]# docker stop myname
myname
[root@docker-01 ~]# docker ps -a
3cbd2bbf3cb0   nginx:latest      "/docker-entrypoint...."   33 minutes ago   Exited (137) 22 seconds ago                                             myname

六、容器的进入

  • 命令格式:docker exec -it 容器ID/名称 /bin/bash
shell 复制代码
[root@docker-01 ~]# docker exec -it mynginx /bin/bash
# 执行exit可以退出容器
root@f0e99cfa10c1:/# exit
exit

七、容器的导出与导入

  • 用户可以将任何一个docker容器从一台机器迁移到另一台机器。在迁移的过程中,可以使用docker export民两个将已经创建好的容器导出为文件,无论这个容器是否处于运行状态还是停止状态均可导出

7.1、容器导出

  • 命令格式:docker export 容器ID/名称 > 文件名
shell 复制代码
# 导出mynginx容器到文件mynginx.tar
[root@docker-01 ~]# docker export mynginx > mynginx.tar
[root@docker-01 ~]# ls -lh mynginx.tar 
-rw-r--r-- 1 root root 182M May 10 22:26 mynginx.tar

7.2、容器导入

  • 命令格式:cat 文件名 | docker import - 生成的镜像名称:标签
shell 复制代码
# 可以直接scp把刚刚导出的容器镜像上传到其他机器上验证效果
[root@docker-02 ~]# cat mynginx.tar | docker import - mynginx:1.0
sha256:dc71be6ceabdf4508ef245c3b5bf750f7d135a0ce15c1574c842c3606c4a0e2f
[root@docker-02 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mynginx      1.0       dc71be6ceabd   3 seconds ago   186MB

八、容器的删除

  • docker rm 容器ID/名称
shell 复制代码
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
e57cb74fc0e2   nginx:latest   "/docker-entrypoint...."   6 seconds ago   Up 5 seconds   80/tcp    myname
[root@docker-01 ~]# docker rm myname
myname
[root@docker-01 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

九、Docker的数据管理

  • 在docker中,为了方便查看容器内产生的数据或者共享多个容器之间的数据,就涉及到容器的数据管理操作。管理docker容器中数据主要有两种方式:数据卷和数据卷容器

数据卷概述

  • 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻就在相对用的容器挂载目录中显示,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行mount操作

9.1、创建数据卷

  • 在docker run命令中使用-v选项可以在容器内创建数据卷。多次使用-v可创建多个数据卷。使用--name选项可以给容器创建一个友好的自定义名称
shell 复制代码
# 例如:使用nginx:latest镜像创建一个名为web的容器,并且创建两个数据卷分别挂载到/data1和/data2目录上
[root@docker-01 ~]# docker run -d -v /data1 -v /data2 --name web nginx:latest8aa51caf3fa61d260a6fb22766fe02e1f7e6bbefa07feb80592df567ef34b3ea
[root@docker-01 ~]# docker exec -it web bash
root@8aa51caf3fa6:/# ls -l
drwxr-xr-x   2 root root    6 May 11 03:20 data1
drwxr-xr-x   2 root root    6 May 11 03:20 data2

9.2、挂载主机目录作为数据卷

  • 使用docker run命令的-v选项可以在创建数据卷的同时,将宿主机的目录挂载到数据卷上使用,以实现宿主机于容器之间的数据迁移。注意:宿主机本地目录的路径您必须是使用的绝对路径。如果路径不存在,docker会自动创建相对应的路径
shell 复制代码
# 例如:使用nginx:latest镜像创建一个名为web-1容器,并且将宿主机的/var/www目录挂载到容器的/data1目录上
[root@docker-01 ~]# docker run -d -v /var/www/:/data1 --name web-1 nginx:latest
fad85d0b53956f198a560075adf9615b6d8f95aed8ed8cd233917f905aadf0bd
[root@docker-01 ~]# touch /var/www/test.html
[root@docker-01 ~]# docker exec -it web-1 bash
root@fad85d0b5395:/# ls /data1/
test.html

9.3、数据卷容器

  • 如果需要在容器之间共享一些数据,最简单的方式就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。使用方法如下:需要创建一个容器作为数据卷容器,之后在其他容器创建时使用--volumes-from挂载数据卷容器中的数据卷使用
shell 复制代码
# 例如:使用前面预先创建好的数据卷容器web。其中所创建的数据卷分别挂载到/data1与/data2目录上,使用--volumes-from来挂载web容器中的数据卷到新的容器,新的容器名为db1
[root@docker-01 ~]# docker run -it --volumes-from web --name db1 nginx:latest bash
root@42e73d8ccca5:/# touch /data1/hello.txt
root@42e73d8ccca5:/# exit
exit
d[root@docker-01 ~]# docker exec -it web bash
root@8aa51caf3fa6:/# ls /data1
hello.txt

十、查看容器日志和详细信息

10.1、查看容器日志

shell 复制代码
# 将容器旧日志打到屏幕上
[root@docker-01 ~]# docker logs 8567f02c60b6


# 实时查看容器日志
[root@docker-01 ~]# docker logs -f 8567f02c60b6


# 结合管道符查看后10行容器日志
[root@docker-01 ~]# docker logs 8567f02c60b6 | tail -10

10.2、查看容器详细信息

shell 复制代码
# 查看容器详细信息,用于高级的调试
[root@docker-01 ~]# docker container inspect 8567f02c60b6

十一、容器的提交

shell 复制代码
# 提交的容器当中已经是提前安装好了vim编辑器的容器,把它提交为yuchao163/centos-vim-7.8.2003镜像,当用这个镜像创建新的容器时,将自带vim编辑器
[root@docker-01 ~]# docker commit 5de8a1c1f640 yuchao163/centos-vim-7.8.2003
相关推荐
Leinwin13 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_8653825013 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇13 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.75914 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣14 小时前
智能体选型实战指南
运维·人工智能
yy552714 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ15 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔17 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密17 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi201517 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑