其他分享
首页 > 其他分享> > Docker基础

Docker基础

作者:互联网

Docker基础

Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以和管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,大大减少编写代码和在生产环境中运行代码之间的延迟。

Docker提供了在简单、隔离的环境(称为容器)中打包和运行应用程序的功能。隔离和安全性使您可以在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。您甚至可以在虚拟机的主机中运行Docker容器!

Docker提供了工具和平台来管理容器的生命周期:

  1. 使用容器开发应用程序及其支持组件。
  2. 容器成为分发和测试应用程序的单元。
  3. 准备就绪后,可以将应用程序作为容器或协调服务部署到生产环境中。无您的生产环境是本地数据中心,云提供商还是两者的混合,其工作原理都相同。

Docker引擎

Docker是具有以下主要组件的客户端-服务器应用程序。

Docker架构

Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。

Docker安装

通常情况下,我们有两种安装Docker的方式,一种是:yum,另一种是二进制安装包。Docker一般情况下是安装在Ubuntu中,因为其内核版本比较高,本次咱们采用CentOS 7

在CentOS上安装

  1. 在阿里云上下载docker-ce.repo

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoCopy to clipboardErrorCopied
    
  2. 安装基础包

    yum install -y yum-utils device-mapper-persistent-data lvm2Copy to clipboardErrorCopied
    
  3. 刷新缓存

    yum makecache fastCopy to clipboardErrorCopied
    
  4. 安装

    # 如果是CentOS 8需要安装下面的包
    wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm
    
    yum localinstall containerd.io-1.2.13-3.2.el7.x86_64.rpm -y
    
    yum -y install docker-ceCopy to clipboardErrorCopied
    
  5. 启动

    systemctl enable --now dockerCopy to clipboardErrorCopied
    
  6. 验证

    [root@localhost ~]# docker info
    Client:
     Debug Mode: false
    
    Server:
     Containers: 15
      Running: 5
      Paused: 0
      Stopped: 10
     Images: 26
     Server Version: 18.09.9
     Storage Driver: overlay2
      Backing Filesystem: xfs
      Supports d_type: true
      Native Overlay Diff: true
     Logging Driver: json-file
     Cgroup Driver: systemd
     Plugins:
      Volume: local
      Network: bridge host macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
     Swarm: inactive
     Runtimes: runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
     runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
     init version: fec3683
     Security Options:
      seccomp
       Profile: default
     Kernel Version: 4.18.0-80.11.2.el8_0.x86_64
     Operating System: CentOS Linux 8 (Core)
     OSType: linux
     Architecture: x86_64
     CPUs: 4
     Total Memory: 1.92GiB
     Name: localhost.localdomain
     ID: FLZM:42YD:NC2K:NATO:YPCA:T6IY:G647:OKPA:WJKK:Z4TQ:AN7R:TMSB
     Docker Root Dir: /var/lib/docker
     Debug Mode: false
     Registry: https://index.docker.io/v1/
     Labels:
     Experimental: false
     Insecure Registries:
      127.0.0.0/8
     Registry Mirrors:
      https://hjvrgh7a.mirror.aliyuncs.com/
     Live Restore Enabled: false
     Product License: Community EngineCopy to clipboardErrorCopied
    

在Ubuntu上安装

  1. 安装必要的一些系统工具

    apt-get -y install apt-transport-https ca-certificates curl software-properties-commonCopy to clipboardErrorCopied
    
  2. 安装GPG证书

    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -Copy to clipboardErrorCopied
    
  3. 写入软件源信息

    sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"Copy to clipboardErrorCopied
    
  4. 更新并安装Docker-CE

    sudo apt-get -y update
    sudo apt-get -y install docker-ceCopy to clipboardErrorCopied
    
  5. 添加配置

添加配置

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://hjvrgh7a.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOFCopy to clipboardErrorCopied

基本使用

Docker容器中至少有一个应用程序运行在前台。

创建容器

docker run -it centos bashCopy to clipboardErrorCopied

docker run:有两个过程:

  1. 检测当前使用的镜像本地是否有,没有则去远程仓库拉取。
  2. 将镜像实例化成容器。

在docker容器中,至少要有一个应用程序运行在前台,否则在启动的一瞬间生命周期就结束了。

为什么加上-it参数之后,就可以了呢?因为伪终端是运行在前台的。

进入容器

在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。

acctch

使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。

[root@instance-gvpb80ao docs]# docker attach nginx
127.0.0.1 - "GET / HTTP/1.1" 308 171 "-" "curl/7.59.0" 0.000 - .Copy to clipboardErrorCopied

exec

这个命令相当于在容器中执行一个命令。官方推荐

[root@instance-gvpb80ao docs]# docker exec -it nginx /bin/bash
nginx [ / ]$
nginx [ / ]$Copy to clipboardErrorCopied

nsenter

需要配合docker inspect来使用(企业当中最长用的方式之一),Docker是用golang语言开发,所以它也支持go语言的摸版语法。

[root@instance-gvpb80ao docs]# nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@6f99ae8757f7:/#Copy to clipboardErrorCopied

SSH

在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。

总结

进入docker container中一般情况下有4种方式,最常用的是exec和nsenter这两种。

端口映射

docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

固定端口

指定端口映射

[root@instance-gvpb80ao docs]# docker run -d -p 8099:80 nginx
5e3c9d5eba477dc7a0e23cc661916d2a7545bc6e65a2de5660e2e20d0abf6fe2
[root@instance-gvpb80ao docs]# docker ps | grep 8099
5e3c9d5eba47 nginx    "/docker-entrypoint.…" 10 seconds ago  Up 9 seconds  0.0.0.0:8099->80/tcp   cool_williamsonCopy to clipboardErrorCopied

随机端口

[root@instance-gvpb80ao docs]# docker run -d --name ppp -P nginx
914e31c98f9b7c3df226076272f4d5b9a2cf99ff3b578baf792eaace4ea6dc7e
[root@instance-gvpb80ao docs]# docker ps | grep ppp
914e31c98f9b  nginx   "/docker-entrypoint.…"   6 seconds ago Up 5 seconds  0.0.0.0:32768->80/tcp  pppCopy to clipboardErrorCopied

复制文件

我们在使用容器的过程中,难免的想临时的与宿主主机之间交换文件。

从容器内复制到容器外

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

[root@instance-gvpb80ao docs]# docker cp daf9c3656be3:/usr/share/nginx/html/index.html .
[root@instance-gvpb80ao docs]# ll | grep index
-rw-r--r-- 1 root root    612 8月  11 22:50 index.htmlCopy to clipboardErrorCopied

从容器外复制到容器内

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
[root@instance-gvpb80ao docs]# docker cp test.yaml daf9c3656be3:/usr/share/nginx/html/
[root@instance-gvpb80ao docs]# docker exec daf9c3656be3 ls /usr/share/nginx/html
50x.html
index.html
test.yamlCopy to clipboardErrorCopied

镜像的导入与导出

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。

对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

使用 export 和 import

export 和 import的针对点是容器,将本机的容器导出为镜像包。

[root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar
[root@instance-gvpb80ao docs]# ll | grep nginx.tar
-rw-r--r-- 1 root root 135117824 9月  24 20:51 nginx.tarCopy to clipboardErrorCopied
[root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@instance-gvpb80ao docs]# docker images | grep test
test/nginx                                                        v1                         02107323de1b        22 seconds ago      131MBCopy to clipboardErrorCopied

使用 save 和 load

save 和 load的正对点是镜像,将本机的镜像导入、导出为镜像包。

[root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar
[root@instance-gvpb80ao docs]# ll | grep busy
-rw-r--r-- 1 root root   1458176 9月  24 21:01 busybox.tarCopy to clipboardErrorCopied
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0
[root@instance-gvpb80ao docs]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0Copy to clipboardErrorCopied
[root@instance-gvpb80ao docs]# docker load < busybox.tar
[root@instance-gvpb80ao docs]# docker load -i busybox.tar
Loaded image ID: sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@instance-gvpb80ao docs]# docker images | grep 685880
busybox                                                           latest                     6858809bf669        2 weeks ago         1.23MBCopy to clipboardErrorCopied

两种方案的差别

标签:clipboardErrorCopied,容器,基础,镜像,Docker,root,docker
来源: https://www.cnblogs.com/tcy1/p/13832533.html