CI/CD - Docker 초심자 학습

1 도커 이해

1 도커 소개

Docker는 Go 언어를 기반으로 하는 오픈 소스 애플리케이션 컨테이너 가상화 기술입니다. Docker의 주요 목표는 캡슐화, 배포, 배포 및 운영과 같은 애플리케이션 구성 요소의 수명 주기 관리를 통해 모든 앱을 어디서나 빌드, 배송 및 실행하여 일회성 캡슐화를 달성하고 모든 곳에서 실행하는 것입니다. 응용 프로그램 구성 요소 수준에서(공식 웹 사이트에서). 여기에서 응용 프로그램 구성 요소는 웹 응용 프로그램, 데이터베이스 서비스 집합 또는 운영 체제나 컴파일러일 수 있습니다.

평신도의 관점에서 Docker는 VMware와 비교할 수 있습니다.프로덕션 환경에서 실행하려는 경우 로컬 응용 프로그램과 필요한 환경을 미러로 직접 패키징하고 Docker에서 미러를 실행하면 문제를 해결할 수 있습니다. 프로덕션 환경의 테스트 환경 및 불일치. (이미지는 일반적인 ubuntu.iso 이미지 파일과 비교할 수 있습니다.)


일관성 없는 개발과 운영 및 유지보수 환경의 문제를 근본적으로 해결하기 위해 도커가 존재하는 이유 . 즉, 설치 시 원본 환경이 그대로 복사되며 개발자는 Docker를 사용하여 협업 코딩 시 "내 컴퓨터에서 정상적으로 작동합니다"라는 문제를 없앨 수 있습니다. 애플리케이션을 개발할 때 애플리케이션에 필요한 파일을 이미지 파일로 패키징하고 도커에서 이미지를 실행합니다. 미러 이미지를 얻으려면 어디에서나 실행하십시오.

Docker는 Linux 커널의 기능을 사용하여 운영 체제에서 여러 가상 환경을 시뮬레이션합니다. 이러한 환경의 응용 프로그램은 모두 동일한 운영 체제에서 실행되고 운영 체제의 리소스를 공유하며 각 응용 프로그램에 대해 별도의 운영 체제를 설치할 필요가 없습니다. 이러한 방식으로 서로 다른 환경이 서로 간섭하지 않고 리소스 소비가 매우 적습니다.동일한 하드웨어 구성에서 실행할 수 있는 Docker 컨테이너의 수는 기존 가상 머신의 수를 훨씬 초과합니다.

Docker는 개발자가 컨테이너화된 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있도록 도와주는 매우 강력한 플랫폼입니다. 동시에 Docker는 응용 프로그램의 이식성 및 운영 안정성을 보장할 수 있으며 서버의 성능도 향상시킬 수 있습니다. 따라서 Docker 기술의 사용은 매우 유망하며 소프트웨어 개발 및 배포를 보다 유연하고 효율적이며 안전하게 만들 수 있습니다.

Docker와 가상 머신 기술의 차이점 비교:

  • 기존의 가상 머신은 하드웨어 일부를 가상화하고 전체 운영 체제를 실행한 다음 이 시스템에 소프트웨어를 설치하고 실행합니다.
  • 컨테이너의 애플리케이션은 호스트 시스템의 커널에서 직접 실행되며 컨테이너에는 자체 커널이나 가상 하드웨어가 없으므로 이식성이 있습니다.
  • 각 컨테이너는 서로 격리되어 있으며 각 컨테이너에는 서로 영향을 주지 않는 자체 파일 시스템이 있습니다.

2 도커 설치

여기에 이미지 설명 삽입
이미지(이미지)
Docker 이미지는 Docker 컨테이너를 생성하는 데 사용할 수 있는 읽기 전용 템플릿입니다. 이미지에는 운영 체제, 애플리케이션, 종속 라이브러리, 구성 파일 등이 포함될 수 있습니다.

컨테이너(컨테이너)
Docker 컨테이너는 가벼운 가상 머신으로 이해할 수 있는 Docker 이미지의 실행 중인 인스턴스입니다.

리포지토리(repository)
도커 웨어하우스는 코드 웨어하우스와 유사하게 도커 이미지를 저장하고 관리하는 데 사용됩니다. Docker는 공식적으로 Docker 이미지를 저장하고 공유할 수 있는 Docker Hub 리포지토리를 제공합니다. 또한 사용자는 자체 개인 창고를 구축하여 자체 Docker 이미지를 저장하고 관리할 수 있습니다.

요약하자면, Docker 이미지는 Docker 컨테이너를 생성하기 위한 기초이고, Docker 컨테이너는 Docker 이미지 인스턴스를 실행하며, Docker 웨어하우스는 Docker 이미지가 저장되고 관리되는 곳입니다. Docker 이미지, 컨테이너 및 웨어하우스를 사용하여 애플리케이션의 신속한 배포, 운영 및 관리를 실현하고 애플리케이션의 이식성 및 확장성을 향상할 수 있습니다.

# 1.卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
# 2.需要的安装包
yum install -y yum-utils

# 3.设置镜像的仓库
# 3.1.默认是国外的,不推荐
yum-config-manager \ 
	--add-repo \ 	
	https://download.docker.com/linux/centos/docker-ce.repo
# 3.2.推荐使用国内的	(这里手敲代码然后复制网站)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4.更新yum软件包索引 
yum makecache fast

# 5.安装docker docker-ce 社区版 ee 是企业版
yum install docker-ce docker-ce-cli containerd.io

# 6、启动docker
systemctl start docker

# 7、使用 docker version 查看是否安装成功
docker version

docker 실행 hello-world
여기에 이미지 설명 삽입
docker 이미지
여기에 이미지 설명 삽입
제거 docker

# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径

3 Alibaba Cloud 이미지 가속

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

4 docker 실행으로 이어지는 hello-world 흐름도 검토

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

5가지 기본 원칙

도커는 어떻게 작동합니까?

  • Docker는 Client-Server 구조의 시스템으로 Docker의 데몬 프로세스는 호스트에서 실행됩니다. 소켓을 통해 클라이언트 측에서 액세스합니다.
  • Docker-Server는 Docker-Client로부터 명령을 받은 후 이 명령을 실행합니다.

여기에 이미지 설명 삽입
Docker가 VM보다 빠른 이유는 무엇입니까?
여기에 이미지 설명 삽입

도커는 가상 머신보다 추상화 계층이 적습니다. 도커는 하드웨어 리소스를 가상화하기 위해 하이퍼바이저가 필요하지 않기 때문에 도커 컨테이너에서 실행되는 프로그램은 실제 물리적 머신의 하드웨어 리소스를 직접 사용합니다. 따라서 docker는 CPU 및 메모리 사용 측면에서 효율성 측면에서 분명한 이점을 갖게 됩니다.

새로운 컨테이너를 생성할 때 도커는 가상머신처럼 운영체제 커널을 다시 로드할 필요가 없어 부팅을 피하고 운영체제 커널을 로드한다. 가상 머신은 분 단위로 Guset OS를 로드하는 반면 도커는 호스트 머신의 운영 체제를 사용하여 이러한 복잡한 프로세스를 초 단위로 생략하므로 새로운 도커 컨테이너를 생성하는 데 몇 초 밖에 걸리지 않습니다.

2 도커 공통 명령 학습

1 Docker의 일반적인 명령

도움말 명령:

docker version	# 显示docker的版本信息。
docker info		# 显示docker的系统信息,包括镜像和容器的数量
docker --help	# 帮助命令

미러 명령:

docker images # 查看所有本地主机上的镜像 可以使用docker image ls代替
docker search # 搜索镜像 
docker pull   下载镜像  docker image pull 
docker rmi 	 删除镜像  docker image rm

docker images 로컬 호스트의 모든 이미지 보기:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

# 解释 
REPOSITORY 		# 镜像的仓库源 
TAG 			# 镜像的标签 
IMAGE ID 		# 镜像的id 
CREATED 		# 镜像的创建时间 
SIZE 			# 镜像的大小

# 可选项 Options:
	-a, --all      # 列出所有的镜像
	-q, --quiet    # 只显示镜像的id

도커 검색 검색 이미지:

[root@iZf8z4ii45kfjc41qrt363Z /]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12298     [OK]       
mariadb                          MariaDB Server is a high performing open sou…   4730      [OK]       

# 可选项
--filter=STARS=3000 搜索出来的镜像就是STARS大于3000的

여기에 이미지 설명 삽입
도커 풀 다운로드 이미지:

# 下载镜像 docker pull 镜像名[:tag]		(tag是版本)
[root@iZf8z4ii45kfjc41qrt363Z /]# docker pull mysql
Using default tag: latest	# 如果不写tag,默认就是latest最新版
latest: Pulling from library/mysql
72a69066d2fe: Pull complete  # 分层下载:docker image 的核心---联合文件系统
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709		# 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest	# 真实地址
# 两条命令等价
docker pull mysql
docker.io/library/mysql:latest
# 指定版本下载
docker pull mysql:5.7

여기에 이미지 설명 삽입

도커 rmi 삭제 이미지:

docker rmi -f 镜像id                # 删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id  # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除全部镜像

여기에 이미지 설명 삽입

컨테이너 명령:
설명: 미러, Linux가 있을 때만 컨테이너를 생성할 수 있습니다. centos 미러를 다운로드하여 테스트하고 학습합니다.

docker pull centos

새 컨테이너를 만들고 시작합니다.

docker run [可选参数] image

# 参数说明
--name = "Name"    容器名字  tomcat01,tomcat02,用来区分容器
-d                 后台方式运行
-it                使用交互方式运行,进入容器查看内容
-p                 指定容器的端口 -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
-P                 随机指定端口
# 测试,启动并进入容器
docker 容器是由 docker 镜像创建的运行实例
[root@iZf8z4ii45kfjc41qrt363Z /]# docker run -it centos /bin/bash
[root@0e1dfb1233d0 /]# ls	# 查看容器内的centos,基础版本,很多命令都是不完善的!
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# 从容器中退回主机
[root@0e1dfb1233d0 /]# exit
exit
[root@iZf8z4ii45kfjc41qrt363Z /]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  patch  proc  root  run  sbin  srv  sys  tmp  usr  var  www

실행 중인 모든 컨테이너를 나열합니다.

# docker ps 命令
       # 列出当前正在运行的容器
  -a   # 列出当前正在运行的容器+带出历史运行过的容器
  -n=? # 显示最近创建的容器	?代表个数
  -q   # 只显示容器的编号

여기에 이미지 설명 삽입
컨테이너를 종료합니다.

exit            # 直接容器停止并退出
Ctrl + P + Q    # 容器不停止退出

여기에 이미지 설명 삽입

컨테이너 삭제:

docker rm 容器id                  # 删除指定容器,不能删除正在运行的容器,如果要强制删除 rm -f	(f是force)
docker rm -f $(docker ps -aq)    # 删除所有的容器
docker ps -aq|xargs docker rm    # 删除所有的容器

여기에 이미지 설명 삽입

컨테이너 시작 및 중지 작업:

  • run은 컨테이너를 생성하고 시작합니다(run은 생성 및 실행과 동일). start는 중지된 컨테이너를 시작합니다(start만 실행).
docker start 容器id        # 启动容器
docker restart 容器id      # 重启容器
docker stop 容器id         # 停止当前正在运行的容器
docker kill 容器id         # 强制停止当前容器

여기에 이미지 설명 삽입

2 기타 일반적인 명령

백그라운드에서 컨테이너를 시작합니다.

# 命令 docker run -d 镜像名
docker run -d centos

# 问题docker ps, 发现 centos 停止了

# 常见的坑, docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# 如nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

로그 보기:

# 自己编写一段shell脚本
[root@iZf8z4ii45kfjc41qrt363Z /]# docker run -d centos /bin/sh -c "while true; do echo kuangshen;sleep 1;done"

# 显示日志
-t                # 显示日志加时间
-f				  # 保留打印窗口,持续打印
--tail number     # 要显示的最后的日志条数

[root@iZf8z4ii45kfjc41qrt363Z /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
babf34105183   centos    "/bin/sh -c 'while t…"   20 seconds ago   Up 19 seconds             strange_blackburn

[root@iZf8z4ii45kfjc41qrt363Z /]# docker logs -tf --tail 10 babf34105183

여기에 이미지 설명 삽입
테스트 후 프로그램을 중지하려면 docker stop id를 입력해야 합니다.

컨테이너에서 프로세스 정보 ps를 확인합니다.

# 命令 docker top 容器id
[root@iZf8z4ii45kfjc41qrt363Z /]# docker top 6eb73bae2d0b
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                9659                9639                0                   17:03               ?                   00:00:00            /bin/sh -c while true; do echo kuangshen;sleep 1;done
root                9908                9659                0                   17:05               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

이미지 소스 데이터 보기:

# 命令 docker inspect 容器id
[root@iZf8z4ii45kfjc41qrt363Z /]# docker inspect 6eb73bae2d0b
[
    {
    
    
        "Id": "6eb73bae2d0ba7ebb21d1c33074236f9c850c77f964eda699d6338ec2a47a361",
        "Created": "2022-03-24T09:03:47.369280208Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true; do echo kuangshen;sleep 1;done"
        ],
        "State": {
    
    
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 9659,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-03-24T09:03:47.61951026Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/6eb73bae2d0ba7ebb21d1c33074236f9c850c77f964eda699d6338ec2a47a361/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/6eb73bae2d0ba7ebb21d1c33074236f9c850c77f964eda699d6338ec2a47a361/hostname",
        "HostsPath": "/var/lib/docker/containers/6eb73bae2d0ba7ebb21d1c33074236f9c850c77f964eda699d6338ec2a47a361/hosts",
        "LogPath": "/var/lib/docker/containers/6eb73bae2d0ba7ebb21d1c33074236f9c850c77f964eda699d6338ec2a47a361/6eb73bae2d0ba7ebb21d1c33074236f9c850c77f964eda699d6338ec2a47a361-json.log",
        "Name": "/keen_neumann",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
    
    
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
    
    
                "Type": "json-file",
                "Config": {
    
    }
            },
            "NetworkMode": "default",
            "PortBindings": {
    
    },
            "RestartPolicy": {
    
    
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
    
    
            "Data": {
    
    
                "LowerDir": "/var/lib/docker/overlay2/881b23da0c743bec39df6695b3f1691213412169e5dd677123f77c9920465c98-init/diff:/var/lib/docker/overlay2/d6b2cfa67a8bba2aed03ec55e57f82ea531461979f05ad93498aef4a20cf046e/diff",
                "MergedDir": "/var/lib/docker/overlay2/881b23da0c743bec39df6695b3f1691213412169e5dd677123f77c9920465c98/merged",
                "UpperDir": "/var/lib/docker/overlay2/881b23da0c743bec39df6695b3f1691213412169e5dd677123f77c9920465c98/diff",
                "WorkDir": "/var/lib/docker/overlay2/881b23da0c743bec39df6695b3f1691213412169e5dd677123f77c9920465c98/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
    
    
            "Hostname": "6eb73bae2d0b",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true; do echo kuangshen;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
    
    
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
    
    
            "Bridge": "",
            "SandboxID": "c3eeb47321de559d83851e35eee18915a2cff7f5c33ca36d200e4a9c25bafe4b",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
    
    },
            "SandboxKey": "/var/run/docker/netns/c3eeb47321de",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "89db5e9e1749f5c1097bea5edf127dccec3338bad26f0123aa18a144c6c30bd0",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
    
    
                "bridge": {
    
    
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "aed4526fdfd2fad1b4c6b8e1aafb1b44713eed863d0d40deb4461782e6ed35ff",
                    "EndpointID": "89db5e9e1749f5c1097bea5edf127dccec3338bad26f0123aa18a144c6c30bd0",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

현재 실행 중인 컨테이너를 입력합니다.

# 我们的容器通常都是使用后台方式运行的,若要进入容器,需要修改一些配置

# 命令
docker exec -it 容器id baseShell

# 测试
[root@iZf8z4ii45kfjc41qrt363Z /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
6eb73bae2d0b   centos    "/bin/sh -c 'while t…"   6 minutes ago   Up 6 minutes             keen_neumann
[root@iZf8z4ii45kfjc41qrt363Z /]# docker exec -it 6eb73bae2d0b /bin/bash
[root@6eb73bae2d0b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6eb73bae2d0b /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:03 ?        00:00:00 /bin/sh -c while true; do echo kuangshen;sleep 1;done
root       396     0  0 09:10 pts/0    00:00:00 /bin/bash
root       419     1  0 09:10 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       420   396  0 09:10 pts/0    00:00:00 ps -ef

# 方式二
docker attach 容器id

# 测试
[root@iZf8z4ii45kfjc41qrt363Z /]# docker attach 6eb73bae2d0b
kuangshen
kuangshen
正在执行当前的代码...

# docker exec        # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach      # 进入容器正在执行的终端,不会启动新的进程

컨테이너에서 호스트로 복사:

# 命令
docker cp [r] 容器id :容器内路径 目的地主机路径
# 参数r : 递归拷贝
# 测试

# 查看当前主机目录下的文件
[root@iZf8z4ii45kfjc41qrt363Z home]# ls
kuangshen  kuangshen.java  kuangstudy2  redis  test1  www
[root@iZf8z4ii45kfjc41qrt363Z home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
0b03b728988b   centos    "/bin/bash"   About a minute ago   Up About a minute             magical_rubin

# 进入docker容器内部
[root@iZf8z4ii45kfjc41qrt363Z home]# docker attach 0b03b728988b
[root@0b03b728988b /]# cd /home     
[root@0b03b728988b home]# ls

# 在容器内新建一个文件
[root@0b03b728988b home]# touch test.java
[root@0b03b728988b home]# exit
exit
[root@iZf8z4ii45kfjc41qrt363Z home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZf8z4ii45kfjc41qrt363Z home]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
0b03b728988b   centos    "/bin/bash"              2 minutes ago    Exited (0) 10 seconds ago               magical_rubin

# 将这个文件拷贝出来到主机上
[root@iZf8z4ii45kfjc41qrt363Z home]# docker cp 0b03b728988b:/home/test.java /home
[root@iZf8z4ii45kfjc41qrt363Z home]# ls
kuangshen  kuangshen.java  kuangstudy2  redis  test1  test.java  www

# 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现打通

exec와 attach의 차이점:
exec를 사용하여 컨테이너에 들어간 후 새 터미널을 열고 그 안에서 작동하는 것입니다. 컨테이너를 빠져나온 후에도 컨테이너는 여전히 실행 중이며,
attach를 사용하면 현재 컨테이너가 실행되고 있는 터미널에서 직접 동작하는 것입니다. 컨테이너에서 나온 후 컨테이너가 멈춥니다.

3 Docker는 Nginx를 설치합니다.

# 1. 搜索镜像 search 建议大家去docker搜索,可以看到帮助文档
# 2. 下载镜像 pull
# 3. 运行测试
[root@iZf8z4ii45kfjc41qrt363Z home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   2 months ago   141MB
centos       latest    5d0da3dc9764   6 months ago   231MB

# -d 后台运行
# --name 给容器命名
# -p 宿主机,容器内部端口
[root@iZf8z4ii45kfjc41qrt363Z home]# docker run -d --name nginx01 -p 3344:80 nginx
76982652da3b9a3b1e51b304050b558818ec2461c83ed6280874dc48b872ab5e
[root@iZf8z4ii45kfjc41qrt363Z home]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
76982652da3b   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:3344->80/tcp   nginx01

[root@iZf8z4ii45kfjc41qrt363Z home]# curl localhost:3344

-p: 컨테이너의 80번 포트는 호스트의 3344번 포트에 바인드(호스트가 아닌 머신에서 접근하기 편리함)
포트 노출도: 방화벽을 해제하면 모든 인터페이스를 외부에 노출시키는 것과 동일
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
. 테스트를 통과한 후 컨테이너에 들어갑니다.

[root@iZf8z4ii45kfjc41qrt363Z home]# docker exec -it nginx01 /bin/bash
root@76982652da3b:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@76982652da3b:/# cd /etc/nginx
root@76982652da3b:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

컨테이너를 나가면 포트가 닫히고 액세스할 수 없습니다
여기에 이미지 설명 삽입
.

nginx 구성 파일을 변경할 때마다 컨테이너에 들어가야 하나요? 그것은 매우 번거로울 것입니다. 그래서 생각했습니다. 컨테이너 외부에 매핑 경로를 제공하여 컨테이너 외부에서 파일 이름을 수정하고 컨테이너 내부를 자동으로 수정할 수 있도록 할 수 있습니까? 그래서 -v 데이터 볼륨 기술이 있습니다!

4 도커 설치 톰캣

# 官方的使用 
docker run -it --rm tomcat:9.0 
# 之前的启动都是在后台运行,停止了容器,容器还是可以查到 
# docker run -it --rm image 一般是用来测试,用完就删除(暂时不建议)

여기에 이미지 설명 삽입

# 下载 
docker pull tomcat 

# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat

# 测试访问没有问题 

들어갈 수 있지만 표시할 페이지가 없습니다. 연결에 성공했지만 프런트 엔드 페이지가 누락되었음을 의미합니다.

여기에 이미지 설명 삽입

# 进入容器
docker exec -it tomcat01 /bin/bash

# 发现问题:1、linux命令少了	 2.webapps文件夹为空
# 原因:阿里云镜像(阉割版),它为保证最小镜像,将不必要的都剔除了→保证最小可运行环境!

# 发现 webapps.dist 下有完整的文件,将其复制到 webapps下
root@962b84bda08f:/usr/local/tomcat/webapps# ls	# 可见webapps文件夹为空
root@962b84bda08f:/usr/local/tomcat/webapps# cd ..
root@962b84bda08f:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@962b84bda08f:/usr/local/tomcat# cd webapps.dist
root@962b84bda08f:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@962b84bda08f:/usr/local/tomcat/webapps.dist# cd ..
root@962b84bda08f:/usr/local/tomcat# cp -r webapps.dist/* webapps		# 复制webapps.dist下的所有文件
root@962b84bda08f:/usr/local/tomcat# cd webapps
root@962b84bda08f:/usr/local/tomcat/webapps# ls	# 复制成功!进入 webapps 文件夹,此时已有文件
ROOT  docs  examples  host-manager  manager

페이지를 새로 고치면 현재 정상적으로 표시될 수 있습니다
여기에 이미지 설명 삽입
. 생각 질문:

앞으로 프로젝트를 배포할 예정인데 매번 컨테이너에 들어가야 한다면 많이 번거롭죠? 컨테이너 외부에 매핑 경로만 제공할 수 있다면 웹앱을 수정할 때 프로젝트를 외부에 배치하기만 하면 내부에 자동으로 동기화될 수 있습니다!

5 Docker 배포 부서 es+kibana

# es 暴露的端口很多! 
# es 十分耗内存 
# es 的数据一般需要放置到安全目录!挂载 
# --net somenetwork 是 网络配置

# 下载启动elasticsearch(Docker一步搞定) 
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 启动了 Linux就卡住了	docker stats 查看 cpu的状态

# es 是十分耗内存的,有1.x个G。我的服务器是2核2G的,比狂神当时的好一点

# 测试一下es是否成功启动了
[root@iZf8z4ii45kfjc41qrt363Z home]# curl localhost:9200
{
    
    
  "name" : "f6909ff78411",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "lx6V_BNwSfGjCVX47xdrMQ",
  "version" : {
    
    
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

docker stats	# 查看 cpu 的状态

여기에 이미지 설명 삽입

# 赶紧关闭,增加内存的限制,修改配置文件。通过 -e 进行环境配置修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

docker stats	# 再次查看 cpu 的状态。这时就好了很多

여기에 이미지 설명 삽입
이때 연결은 여전히 ​​성공할 수 있습니다. 아래를 참조하십시오.

[root@iZf8z4ii45kfjc41qrt363Z home]# curl localhost:9200
{
    
    
  "name" : "92b610e42bcd",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "UePTTR9TQyqnFf8H5lQdKw",
  "version" : {
    
    
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

숙제: kibana를 사용하여 es에 연결하시겠습니까? 네트워크 연결 방법에 대해 생각해 보십시오.
여기에 이미지 설명 삽입

6 도커 시각화

  • portainer (먼저 사용)
  • Rancher(CI/CD 재사용)

포테이너란?
Docker GUI 관리 도구! 우리가 운영할 배경 패널을 제공하십시오!

# 运行如下命令即可 打开可视化服务
docker run -d -p 8088:9000 \--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

http://192.168.21.13:8088/#/초기화/관리자

관리자 asdfghjkl

성공 후 암호를 설정하고 구성할 로컬을 선택합니다.
여기에 이미지 설명 삽입
인터페이스에 들어간 후
여기에 이미지 설명 삽입
로컬을 클릭하여 현재 컨테이너 및 이미지 상태를 봅니다.
여기에 이미지 설명 삽입

3 Docker 이미지 설명

미러는 소프트웨어 운영 환경과 운영 환경을 기반으로 개발된 소프트웨어를 패키징하는 경량의 실행 가능한 독립 소프트웨어 패키지로, 특정 소프트웨어를 실행하는 데 필요한 코드, 런타임 라이브러리, 환경 변수 및 구성 파일을 포함합니다. .

모든 애플리케이션과 환경은 도커 이미지로 직접 패키징되며 직접 실행할 수 있습니다.

미러 이미지를 얻는 방법:

  • 원격 저장소에서 다운로드
  • 다른 사람이 복사
  • 거울 DockerFile을 직접 만드십시오.

도커 이미지 로딩 원리

UnionFs(Union File System):
다운로드할 때 계층별 다운로드가 표시됩니다. 이렇게 하면 모든 수정 사항을 기록할 수 있습니다.

UnionFs(Union File System): Union File System(UnionFs)은 계층화된 경량 고성능 파일 시스템입니다. 레이어 중첩에 대한 제출로 파일 시스템의 수정을 지원합니다. 동시에 다른 디렉터리는 동일한 가상 파일 시스템 아래에 마운트됩니다(여러 디렉토리를 단일 가상 파일 시스템으로 통합). Union 파일 시스템은 Docker 이미지의 기반입니다. 레이어를 통해 이미지를 상속받을 수 있으며, 기본 이미지(부모 이미지 없이)를 기반으로 다양한 특정 애플리케이션 이미지를 만들 수 있습니다.

기능: 동시에 여러 파일 시스템을 로드하지만 외부에서는 하나의 파일 시스템만 볼 수 있습니다.결합 로드는 모든 계층의 파일 시스템을 중첩하여 최종 파일 시스템에 모든 기본 파일과 디렉토리를 포함합니다.

도커 이미지 로딩 원리:
도커 이미지는 실제로 계층별 파일 시스템으로 구성되며 이 파일 시스템 계층은 UnionFS입니다.

bootfs(부트 파일 시스템)는 주로 부트로더와 커널을 포함한다. 이 계층은 부트 로더와 커널을 포함하여 일반적인 Linux/Unix 시스템과 동일합니다. 부트가 로드되고 나면 전체 커널이 메모리에 있게 되는데 이때 메모리 사용 권한은 bootfs에서 커널로 넘어가게 되는데 이때 시스템은 bootfs도 언로드하게 된다.

모든 이미지를 로드해야 하므로 bootfs는 공용입니다.

bootfs 위에 rootfs(루트 파일 시스템). 일반적인 Linux 시스템에서 /dev, /proc, /bin을 포함합니다. /etc와 같은 표준 디렉토리 및 파일. rootfs는 Ubuntu, Centos, Little Red Riding Hood 등과 같은 다양한 운영 체제 배포판입니다.

컨테이너가 포함하는 폴더가 비슷하기 때문에 컨테이너는 작은 Linux 시스템입니다.

여기에 이미지 설명 삽입
일반적으로 우리가 가상 머신에 설치하는 CentOS는 몇 G인데 Docker의 경우 왜 여기만 200M입니까?
여기에 이미지 설명 삽입
간소화된 OS의 경우 rootfs는 매우 작을 수 있습니다. 가장 기본적인 명령, 도구 및 프로그램 라이브러리만 포함하면 됩니다. 기본 계층이 호스트의 커널을 직접 사용하기 때문에 rootfs만 제공하면 됩니다. 다른 Linux 배포판의 경우 부팅은 기본적으로 동일하지만 rootfs는 다를 것이므로 다른 배포판은 bootfs를 공유할 수 있습니다.

가상 머신은 분 수준이고 컨테이너는 두 번째 수준입니다!

레이어 이해:
미러 다운로드, 다운로드 로그 출력에 주의, 레이어별로 다운로드되는 것을 볼 수 있습니다.첫 번째
레이어는 이미 존재하는 이미 존재하는 기본 레이어입니다.

여기에 이미지 설명 삽입
생각: Docker 이미지가 이 계층 구조를 채택하는 이유는 무엇입니까?

가장 큰 장점은 리소스 공유입니다! 예를 들어, 동일한 기본 이미지에서 여러 이미지를 빌드하는 경우 호스트는 하나의 기본 이미지만 디스크에 보관하고 하나의 기본 이미지만 메모리에 로드하면 모든 컨테이너와 각 계층이 제공될 수 있습니다. 이미지를 공유할 수 있습니다.

명령을 사용하여 이미지 계층화 방법을 볼 수 있습니다 docker image inspect 镜像名.

여기에 이미지 설명 삽입
이해하다:

모든 Docker 이미지는 기본 이미지 레이어로 시작하며 수정 또는 추가가 발생하면 현재 이미지 레이어 위에 새 이미지 레이어가 생성됩니다.

간단한 예로 우분투 리눅스16.04 기반으로 새로운 이미지가 생성되면 이것이 새로운 이미지의 첫 번째 레이어이고, 이미지에 파이썬 패키지가 추가되면 그 위에 두 번째 이미지 레이어가 생성됩니다. 기본 이미지 레이어 ; 보안 패치를 계속 추가하면 세 번째 미러 레이어가 생성됩니다. 이미지에는 현재 아래 그림과 같이 3개의 미러 레이어가 포함되어 있습니다(단지 데모를 위한 매우 간단한 예입니다).

여기에 이미지 설명 삽입
추가 이미지 레이어를 추가하는 동안 이미지는 항상 모든 현재 이미지의 조합으로 유지된다는 점을 이해하는 것이 중요합니다. 아래 그림에 간단한 예가 나와 있습니다. 각 이미지 레이어에는 3개의 파일이 포함되어 있고 이미지에는 2개의 이미지 레이어에서 6개의 파일이 포함되어 있습니다.

여기에 이미지 설명 삽입
위 사진의 미러 레이어는 이전 사진과 약간 다르며 주요 목적은 파일 표시를 용이하게 하는 것입니다.

아래 그림은 약간 복잡한 3계층 이미지를 보여주고 있는데, 외부에서 보면 전체 이미지는 6개의 파일만 존재합니다. 이미지
여기에 이미지 설명 삽입
레이어 파일이 기본 이미지 레이어의 파일을 덮어씁니다. 이렇게 하면 파일의 업데이트된 버전이 새 이미지 레이어로 이미지에 추가됩니다.

기능:
Docker 이미지는 모두 읽기 전용이며 컨테이너가 시작되면 새로운 쓰기 가능한 레이어가 이미지 위에 로드됩니다!
이 레이어는 우리가 일반적으로 컨테이너 레이어라고 부르는 것이며 컨테이너 아래의 모든 것을 미러 레이어라고 합니다!
여기에 이미지 설명 삽입
읽기 전용 파일만 끌어오고 이미지는 실행 후 실행을 시작하는데 보통 도커에서 이미지를 운영하는데 이때의 운영 수준은 컨테이너 계층이다.

커밋 미러

docker commit 提交容器成为一个新的副本 

# 命令和git原理类似 
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]	# tag 表示版本

전투 테스트:

# 2、成功后新建一个会话,运行 tomcat
docker exec -it 容器id /bin/bash

# 3、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!
# 4、拷贝文件进去
cp -r webapps.dist/* webapps
# 可以看到拷贝成功了,基本的文件有了
root@fe0570359ee5:/usr/local/tomcat# cd webapps
root@fe0570359ee5:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

# 5、将操作过的容器通过commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己修改完后的镜像。 
# 格式
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG] 
# 实际操作	这里的镜像名为:tomcat02;		版本为:1.0
docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0

여기에 이미지 설명 삽입
현재 컨테이너의 상태를 저장하고 싶다면 가상 머신을 사용할 때 스냅샷처럼 커밋을 통해 제출하고 미러 이미지를 얻을 수 있습니다.
성공적으로 시작하기! ! !
성공적으로 시작하기! ! !
성공적으로 시작하기! ! !

Supongo que te gusta

Origin blog.csdn.net/zs18753479279/article/details/132102679
Recomendado
Clasificación