首页 > 其他分享 >docker容器实验记录(一)

docker容器实验记录(一)

时间:2024-09-03 20:26:40浏览次数:11  
标签:容器 ... 记录 web1 镜像 docker root

容器

没有父进程,PID == 1
是所有程序的根进程
上帝进程死亡系统实例也就关闭了

1.概述

1.1 技术起源

  • Linux容器的起源

-容器的起源可以追溯到1979年 UNIX 系统中提供的 chroot 命令,容器的最初的设计目标是为了隔离计算机中的各类资源,以便降低软件开发、测试阶段的风险,或者充当蜜罐,吸引黑客的攻击,以便监视黑客的行为。
-最初的容器是以 chroot 为代表的文件隔离技术,但这并不完美,如主机名、网络、系统进程、用户等都无法隔离
  • 名称空间与控制组

-为了实现完美的隔离机制,2002年 Linux引入了一种由内核直接提供的全局资源封装的全新隔离机制(名称空间)用来解决隔离的问题,至2009年,Linux内核已经支持了UTS、IPC、PID、NETWORK、MOUNT等多个名称空间

-Linux 解决资源配额的方案是控制组(Cgroups),它与名称空间一样直接由内核提供功能,用来隔离或者说分配并限制某个进程组能够使用的资源量,包括占用CPU 时间、内存大小、磁盘 I/O 速度,等等
  • 容器诞生

-当文件系统、访问、资源都可以被隔离后,容器已经有它降生所需的全部条件,Linux 内核开始提供 Cgroups的同一时间,就马上发布了名为 LXC 的系统级虚拟化功能

-LXC 带着令人瞩目的光环登场,可惜的是,LXC 在设定自己的发展目标时,被前辈们的影响所局限住。LXC 眼中的容器是一种封装系统的强量化虚拟机。这种局限的思想也决定了LXC 不可能形成今天的容器生态的,所以,接下来舞台的聚光灯终于落到了 Docker身上。

2. Docker

容器故障排错:
1.使用inspect 查看有没有异常信息
2.使用logs 查看报错信息

解决思路:
1.cp和logs 在容器没有启动的时候还可以使用

2.1 概述

  • 项目出现

2013年3月,一个名为 Docker的项目宣布开源
当时的人们并没有意识到这款软件将要带来怎样的技术变革。
它的出现促使“容器”从一个阳春白雪的只流传于机客口中的技术词汇,逐渐走向整个IT舞台的中央,短短数年时间,就已成为开发、测试、部署等各个环节都难以或缺的基础支撑。是什么样的魔力让 Docker可以从一问世就惊艳世间。
  • 容器理念

-促使 Docker的一问世就惊艳世间的,不是什么黑科技式的秘密武器,而是其符合历史潮流的创意与设计理念,还有充分开放的生态环境

-早期的容器技术是一种封装系统的轻量级虚拟化,Docker 眼中“容器技术”是一种以应用为核心,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段

-Docker 的容器中没有系统
  • 开放的理念

-2014年,Docker开源了自己用 Golang开发的 Libcontainer

-2015年,在Docker 的主导和倡议下,多家公司联合制订了“开放容器交互标准”(OCI),这是一个关于容器格式和运行时的规范文件,其中包括:
-运行时标准(RUNTIME-SPEC)
-容器镜像标准(IMAGE-SPEC)
-镜像分发标准(DISTRIBUTION-SPEC)
  • 三大概念

-容器:容器是一个运行在隔离环境中的程序

-镜像:镜像是只读的模板,包含了创建容器所需的所有文件和配置信息

-仓库:仓库是用来存储、分发、管理镜像的地方

2.2 docker安装

  • 环境需求

需要64为操作系统
内核版本 > 2.6.32
  • 配置自定义 Yum仓库

-华为云提供的 Yum 中没有docker 软件包
-向自定义 Yum 仓库中添加 docker软件包
-docker软件包位于 本阶段/docker 目录中
[root@ecs-proxy s4]# rsync -av docker/ /var/localrepo/docker/
[root@ecs-proxy s4]# createrepo --update /var/localrepo
  • 开启路由转发(让容器里可以和外部通信)

[root@docker ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
[root@docker ~]# sysctl -p
  • 安装docker

[root@docker ~]# dnf install -y docker-ce
[root@docker ~]# systemctl enable --now docker
# 查看服务器与客户端版本
[root@docker ~]# docker version
  • 配置镜像仓库

[root@docker ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors":["https://08fd160814000f2c0f84c01dab5db9e0.mirror.swr.myhuaweicloud.com"],
    "insecure-registries":[]
}
[root@docker ~]# systemctl restart docker
# 查看 docker 服务配置信息
[root@docker ~]# docker info
... ...
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://https://08fd160814000f2c0f84c01dab5db9e0.mirror.swr.myhuaweicloud.com/
 Live Restore Enabled: false 
提示:registry-mirrors里面是镜像仓库加速器地址,本次实验使用的是华为云 广州地区的镜像加速地址

2.3 镜像管理

2.3.1 镜像概述

-镜像是创建容器的核心
-镜像使用COW技术
-镜像采用分层设计
-镜像始终都是只读的

2.3.2 创建容器

-首先使用 COW为镜像创建一个读写层,容器在读写层运行
-这种方式可以让一个镜像创建无数个容器

2.3.3 获取镜像

镜像可以从官方镜像仓库下载,也可以自己制作
官方镜像仓库:https://hub.docker.com
从官方下载较慢,可以使用国内的镜像站加速
添加配置文件:/etc/docker/daemon.json
{
  "registry-mirrors": ["这里配置镜像仓库加速器地址"],
  "insecure-registries":[]
}

 

2.4 容器管理命令

2.4.1 镜像管理命令

    命令                              说明
docker images 查看本机镜像
docker pull 镜像名称:标签 下载镜像
docker save 镜像名称:标签 -o 文件名 备份镜像为tar包
docker load -i 备份文件名称 导入备份的镜像文件
docker history 镜像名称:标签 查看镜像的制作历史

2.4.2 容器管理命令

        命令                          说明
docker run -it(d) 镜像名称:标签 创建容器
docker ps 查看容器的信息
docker inspect 镜像名称|容器名称   查询(容器/镜像)的详细信息
docker [start|stop|restart] 容器id   启动、停止、重启容器
docker exec -it 容器ID 启动命令 在容器内执行命令
docker logs 容器ID   查看容器日志
docker cp 路径1 路径2 拷贝文件:路径格式(本机路径、容器ID/路径)
docker rm 容器ID   删除容器
docker tag ID:标签 镜像名称:新的标签 创建新的镜像名称和标签
docker rmi 镜像名称:标签 删除镜像(必须先删除该镜像启动的所有容器)
1. run
常用参数
-i 交互式
-t 分配终端
-d 后台运行
--name 指定容器名字
--rm 容器结束后自动删除,在内存中建立临时容器
转入后台快捷键(ctrl-p + ctrl-q)
# 创建一个容器
[root@docker-0001 ~]# docker run -it myos:8.5 
[root@3e0f2a086afb /]# hostname
3e0f2a086afb
[root@3e0f2a086afb /]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 15:13 pts/0    00:00:00 /bin/bash
root          22       1  0 15:13 pts/0    00:00:00 ps -ef
[root@3e0f2a086afb /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 16  bytes 1392 (1.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@3e0f2a086afb /]# exit
# 创建后台容器
[root@docker-0001 ~]# docker run -itd myos:httpd
893a7051e5f2dccbfd31fa4d27aecfde1935ac95215e09ea7901cfaeab207aeb
# 创建名为web1的后台容器
[root@docker-0001 ~]# docker run -itd --name web1 myos:nginx
14b669a75a95e4b95e4c2f581b331ef4e24d74a622d218e5bfdce01f18f47165
2. ps
[root@docker-0001 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS     NAMES
14b669a75a95   myos:nginx   "nginx -g 'daemon of…"   14 minutes ago   Up 14 minutes   80/tcp    web1
893a7051e5f2   myos:httpd   "httpd -DFOREGROUND"     14 minutes ago   Up 14 minutes   80/tcp    modest_allen
# 字段解析        镜像        上帝进程                    什么时间创建      容器状态          端口        名称
[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS                      PORTS     NAMES
14b669a75a95   myos:nginx   "nginx -g 'daemon of…"   14 minutes ago   Up 14 minutes               80/tcp    web1
893a7051e5f2   myos:httpd   "httpd -DFOREGROUND"     14 minutes ago   Up 14 minutes               80/tcp    modest_allen
3e0f2a086afb   myos:8.5     "/bin/bash"              19 minutes ago   Exited (0) 15 minutes ago             fervent_euclid
[root@docker-0001 ~]# docker ps -aq     # 只显示ID
14b669a75a95
893a7051e5f2
3e0f2a086afb
3. start、stop、restart
[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
14b669a75a95   myos:nginx   ... ...  Up 25 minutes   80/tcp    web1
893a7051e5f2   myos:httpd   ... ...  Up 25 minutes   80/tcp    hawking
3e0f2a086afb   myos:8.5     ... ...  Exited (0)                yonath
# 启动容器
[root@docker-0001 ~]# docker start web1 3e0f2a086afb
web1
3e0f2a086afb
[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
14b669a75a95   myos:nginx   ... ...  Up 25 minutes   80/tcp    web1
893a7051e5f2   myos:httpd   ... ...  Up 25 minutes   80/tcp    hawking
3e0f2a086afb   myos:8.5     ... ...  Up 2 seconds              yonath
# 停止容器
[root@docker-0001 ~]# docker stop web1 
web1
# 命令替换,停止所有容器
[root@docker-0001 ~]# docker stop $(docker ps -aq)
14b669a75a95
893a7051e5f2
3e0f2a086afb
[root@docker-0001 ~]# docker ps -a
CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
14b669a75a95   myos:nginx   ... ...  Exited (0)                web1
893a7051e5f2   myos:httpd   ... ...  Exited (0)                hawking
3e0f2a086afb   myos:8.5     ... ...  Exited (0)                yonath
# 重启容器
[root@docker-0001 ~]# docker restart web1
web1
4. inspect
# 查询镜像的详细信息
[root@docker-0001 ~]# docker inspect myos:httpd
{   ......
    "Cmd": [
        "httpd",
        "-DFOREGROUND"
    ],
    ......
}
# 查询容器的详细信息
[root@docker-0001 ~]# docker inspect web1 893a7051e5f2
[
    { ... ...
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
     ... ...
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
     ... ...
     }
]
5. exec、cp、logs
# 在容器内执行非交互命令
[root@docker ~]# docker exec -it web1 ls
50x.html  index.html
# 在容器内执行交互命令
[root@docker ~]# docker exec -it web1 bash 
[root@14b669a75a95 html]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ... ...
[root@14b669a75a95 html]# vim /usr/local/nginx/conf/nginx.conf
32:    listen    80
[root@14b669a75a95 html]# exit
​
# 从容器内拷贝文件出来
[root@docker ~]# docker cp web1:/usr/local/nginx/conf ./
Successfully copied 45.6kB to /root/./
# 重启容器
[root@docker ~]# docker restart web1
web1
[root@docker ~]# docker ps -a
14b669a75a95   myos:nginx   ... ...  Exited (1)                web1
​
# 查看日志拍错
[root@docker ~]# docker logs web1 
nginx: [emerg] invalid parameter "server_name" in /usr/local/nginx/conf/nginx.conf:33
​
# 修复配置文件错误
[root@docker ~]# vim conf/nginx.conf
32:    listen    80;
[root@docker ~]# docker cp conf/nginx.conf web1:/usr/local/nginx/conf/nginx.conf
Successfully copied 4.61kB to web1:/usr/local/nginx/conf/nginx.conf
​
[root@docker ~]# docker restart web1
web1
[root@docker ~]# docker ps
CONTAINER ID   IMAGE        ... ...  STATUS          PORTS     NAMES
14b669a75a95   myos:nginx   ... ...  Up 2 seconds    80/tcp    web1
6. rm、rmi、tag
# 删除容器
[root@docker ~]# docker rm 47ded92f442f
# 强制删除容器
[root@docker ~]# docker rm -f web1
# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
6d6884244a99
​
# 删除一个镜像
[root@docker ~]# docker rmi -f busybox:latest
Untagged: busybox:latest
# 已经创建了容器的镜像无法删除
[root@docker-0001 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
... ...
myos         latest    1de38c85c2d1   13 months ago   4.67MB
<none>       <none>    a9d583973f65   2 years ago     1.23MB
# 给镜像设置一个新的名称标签
[root@docker ~]# docker tag a9d583973f65 busybox:latest
[root@docker ~]# docker images
[root@docker-0001 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
......
myos         latest    1de38c85c2d1   13 months ago   4.67MB
busybox      latest    a9d583973f65   2 years ago     1.23MB

 

2.5 简单镜像制作

# 使用基础镜像创建一个容器
[root@docker ~]# docker run -itd --name linux rockylinux:8.5
# 删除容器内的Yum配置文件
[root@docker ~]# docker exec -it linux rm -rf /etc/yum.repos.d
# 拷贝宿主机的Yum配置文件到容器内
[root@docker ~]# docker cp /etc/yum.repos.d linux:/etc/
# 在容器内安装工具软件包
[root@docker ~]# docker exec -it linux dnf install -y net-tools vim-enhanced tree bash-completion iproute procps-ng psmisc
# 清理缓存文件
[root@docker ~]# docker exec -it linux dnf clean all
# 停止容器
[root@docker ~]# docker stop linux
# 把容器制作成镜像
[root@docker ~]# docker commit linux mylinux:latest
sha256:7a4449e20f4c59d1f6c4db838b4724cbf63c8f4195513c5f17d053c7752891d5
# 查看新制作的镜像
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mylinux      latest    b64da40467ae   3 seconds ago   249MB
rockylinux   8.5       210996f98b85   13 months ago   205MB
# 删除制作镜像的容器
[root@docker ~]# docker rm -f linux 
linux

 

2.6 容器部署应用

  • 部署 apache 服务

# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
# 创建一个名为 myweb 的容器
[root@docker ~]# docker run -it --rm --name myweb mylinux:latest
#-----------------------------------------------------------
# 在容器内安装部署 apache
[root@a7f9d0c3e3e2 /]# dnf install -y httpd
[root@a7f9d0c3e3e2 /]# echo "Hello World ." >/var/www/html/index.html
[root@a7f9d0c3e3e2 /]# cat /usr/lib/systemd/system/httpd.service
[root@a7f9d0c3e3e2 /]# export LANG=C
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
# 在另一个终端完成访问验证
  • 为 apache 添加解析 php 文件支持

# ctrl + c 终止 httpd 服务运行
[root@a7f9d0c3e3e2 /]# dnf install -y php
[root@a7f9d0c3e3e2 /]# vim /etc/httpd/conf.modules.d/00-mpm.conf
11: LoadModule mpm_prefork_module ... ... # 去掉注释 
23: # LoadModule mpm_event_module ... ... # 注释配置 
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
# 服务不要关闭,在其他终端完成测试
  • 验证配置

# 在另一个终端拷贝 public/info.php 到 docker 主机
[root@docker ~]# docker cp info.php myweb:/var/www/html/
[root@docker ~]# curl http://172.17.0.2/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 172.17.0.1
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.61.1
    [REQUEST_URI] => /info.php
)
php_host:   616e75df56ae
1229
 

标签:容器,...,记录,web1,镜像,docker,root
From: https://www.cnblogs.com/pengcan2845732281/p/18395393

相关文章

  • docker安装
    1.卸载旧版首先如果系统中已经存在旧的Docker,则先卸载:yumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-logrotate\docker-engine\docker-selinux2.配置......
  • Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListMap
    ConcurrentMapConcurrentMap是Java并发包中提供的一个接口,它继承了java.util.Map接口,专门用于支持高并发环境下的线程安全操作。ConcurrentMap提供了一系列线程安全的方法,旨在解决在多线程环境下使用普通Map类型(如HashMap)时可能出现的竞态条件和数据不一致问题。......
  • Dockerfile 详解
    Dockerfile是一个用于定义Docker镜像构建过程的文本文件。它包含了一系列的指令,这些指令描述了如何从基础镜像创建一个新的镜像。Docker使用这些指令自动化地构建镜像,并且可以确保创建出的镜像是一致的、可重复的。Dockerfile的常用指令FROM指定基础镜像。例如:FROMu......
  • Docker-compose 详解
    docker-compose是一个用于定义和运行多容器Docker应用程序的工具。它使用一个docker-compose.yml文件来配置应用程序的服务、网络和数据卷,并通过简单的命令来管理这些服务。以下是docker-compose的一些核心概念和常用命令:docker-compose.yml文件docker-compose.yml是一......
  • minio-docker
    docker-composeversion:"3"services:minio:image:minio/minio:latestcontainer_name:miniorestart:alwaysports:-"9000:9000"-"9090:9090"......
  • Docker 常用命令
    镜像管理列出镜像dockerimages拉取镜像dockerpull<image>删除镜像dockerrmi<image>构建镜像dockerbuild-t<tag><path>容器管理列出运行中的容器dockerps列出所有容器(包括停止的)dockerps-a运行容器dockerrun[options]<image>......
  • Docker常用网路介绍
    说明Docker网络模式配置说明host模式–net=host容器和宿主机共享Networknamespace。container模式–net=container:NAME_or_ID容器和另外一个容器共享Networknamespace。kubernetes中的pod就是多个容器共享一个Networknamespace。none模式......
  • Docker内部组件介绍
    Docker的内部组件主要包括:DockerDaemon(dockerd):管理容器和镜像,处理DockerAPI请求。DockerClient(docker):与DockerDaemon交互的命令行工具。DockerImages:用于创建容器的不可变模板。DockerContainers:从镜像创建的运行实例。DockerRegistry:存储......
  • 四款主流 Docker 可视化工具,免费又好用 - 推荐使用朵云
    前言Docker提供了命令行工具来管理Docker的镜像和运行Docker的容器。我们也可以使用图形工具来管理Docker。目前,主流的Docker图形工具有DockerClouds、DockerUl、Portainer和Shipyard。DockerClouds朵云DockerClouds朵云是一款最简单的,单机环境中的管理Docke......
  • CentOS 7 docker 部署遇到内网通,外网不同 问题
     问题  [root@localhost~]#systemctlstatusnetwork●network.service-LSB:Bringup/downnetworkingLoaded:loaded(/etc/rc.d/init.d/network;bad;vendorpreset:disabled)Active:failed(Result:exit-code)sinceTue2024-09-0314:21:22CST;......