Linux----------容器

一、容器简介

Docker 帮助系统管理员和程序员在容器中开发应用程序,并且可以扩展到成千上万的节点,容器和 VM(虚拟机)的主要区别是,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短,容器使用宿主操作系统的内核,而虚拟机使用独立的内核,Docker 的局限性之一是,它只能用在 64 位的操作系统上。

  • docker的理念:
  • 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

1.1 容器的定义

Docker的基本组成:镜像(image)、容器(container)、仓库(repository)
Docker利用容器(container)独立运行的一个或一组应用。容器是用镜像创建的运行实例,每个容器都行相互隔离的、保证安全的平台。
容器是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

1.2 镜像的定义

UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

镜像加载原理:docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

二、简单安装容器

环境:
系统版本:CentOS Linux release 7.6.1810 (Core)
内核版本:3.10.0-957.el7.x86_64

##Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:
[root@186 ~]# yum install docker* -y
...........................................................

##如果报错就安装三个依赖包,yum-utils提供yum-config-manager包,用来管理yum配置文件;lv2和device-mapper-persistent-data为dockerdevicemapper存储设备的必须依赖
[root@186 ~]# yum install -y yum-utils device-mapper*  lvm2
................................................................................................

##安装成功就启动服务,查看服务状态检查是否启动成功
[root@186 ~]# systemctl start docker
[root@186 ~]# systemctl enable docker.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

[root@186 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 四 2019-08-15 15:00:22 CST; 16s ago
     Docs: http://docs.docker.com
 Main PID: 8229 (dockerd-current)
   CGroup: /system.slice/docker.service
           ├─8229 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtim...
           └─8234 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics...

8月 15 15:00:20 186 dockerd-current[8229]: time="2019-08-15T15:00:20.993812526+08:00" level=info msg="libcontainerd: n... 8234"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.077694666+08:00" level=info msg="Graph migration ...conds"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.078553209+08:00" level=info msg="Loading containe...tart."
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.099355199+08:00" level=info msg="Firewalld running: true"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.261051865+08:00" level=info msg="Default bridge (...dress"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.425824071+08:00" level=info msg="Loading containe...done."
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.492111727+08:00" level=info msg="Daemon has compl...ation"
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.492745036+08:00" level=info msg="Docker daemon" c...1.13.1
8月 15 15:00:22 186 systemd[1]: Started Docker Application Container Engine.
8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.500602634+08:00" level=info msg="API listen on /v....sock"
Hint: Some lines were ellipsized, use -l to show in full.

##查看docker版本。docker版本为1.13.1,API版本为1.26
[root@186 ~]# docker version 
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      7f2769b/1.13.1
 Built:           Mon Aug  5 15:09:42 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      7f2769b/1.13.1
 Built:           Mon Aug  5 15:09:42 2019
 OS/Arch:         linux/amd64
 Experimental:    false

##下载官方我CentOS镜像到本地并确认
[root@186 ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
8ba884070f61: Pull complete 
Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c
Status: Downloaded newer image for docker.io/centos:latest
[root@186 ~]# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              9f38484d220f        5 months ago        202 MB

##切入到容器中,我们可以看到 CentOS 容器已经被启动,并且我们看到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。断开输入exit
[root@186 ~]# docker run -i -t centos /bin/bash
[root@31a625f874c1 /]# ip a
bash: ip: command not found
[root@31a625f874c1 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

##显示当前正在运行容器的列表
[root@186 ~]# docker ps -a 
[root@186 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
139e4dee63e1        centos              "/bin/bash"         19 seconds ago      Exited (0) 18 seconds ago                         sad_tesla
31a625f874c1        centos              "/bin/bash"         26 minutes ago      Exited (127) 25 minutes ago                       zealous_saha

三、容器常用命令

  • 管理命令:
  container   管理容器
  image       管理镜像
  network     管理网络
  node        管理Swarm节点
  plugin      管理插件
  secret      管理Docker secrets
  service     管理服务
  stack       管理Docker stacks
  swarm       管理Swarm集群
  system      查看系统信息
  volume      管理卷

如:docker container ls 显示所有容器

  • 普通命令:
  attach     进入一个运行的容器
  build      从一个DockerFile构建镜像
  commit     从容器创建一个镜像
  cp          从容器和主机文件系统之间拷贝文件 
  create      创建一个容器
  diff        检查容器文件系统上的更改
  events      从服务器获取实时事件
  exec        在正在运行的容器中运行命令
  export      将容器的文件系统导出为tar存档
  history     显示镜像的历史记录
  images      查看镜像列表
  import      从归档文件中创建镜像
  info        显示系统范围的信息
  inspect     返回Docker对象的低级信息
  kill        kill运行中的容器
  load        从存档或者STDIN加载镜像
  login       登陆docker镜像仓库
  logout      退出docker镜像仓库
  logs        获取一个容器的日志
  pause       暂停一个或多个容器中的所有进程
  port        查看端口映射或容器的特定映射列表
  ps          查看容器列表
  pull        从镜像仓库拉取镜像
  push        将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
  rename      重命名容器
  restart     重启容器
  rm          删除容器
  rmi         删除镜像
  run         创建一个新的容器并运行一个命令
  save        将指定镜像保存成 tar 归档文件
  search      从Docker Hub搜索镜像
  start       启动容器
  stats       实时显示容器资源使用情况的统计信息
  stop       停止容器
  tag         标记本地镜像,将其归入某一仓库
  top         展示一个容器中运行的进程
  unpause     恢复容器中所有的进程
  update      更新容器配置
  version    显示Docker的版本信息
  wait        阻塞直到容器停止,然后打印退出代码

如:docker images 显示所有镜像

3.1 run创建容器

docker run 命令格式

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]  
 
  -d, --detach=false         指定容器运行于前台还是后台,默认为false   
  -i, --interactive=false   打开STDIN,用于控制台交互  
  -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false  
  -u, --user=""              指定容器的用户  
  -a, --attach=[]            标准输入输出流和错误信息(必须是以非docker run -d启动的容器)
  -w, --workdir=""           指定容器的工作目录 
  -c, --cpu-shares=0        设置容器CPU权重,在CPU共享场景使用  
  -e, --env=[]               指定环境变量,容器中可以使用该环境变量  
  -m, --memory=""            指定容器的内存上限  
  -P, --publish-all=false    指定容器暴露的端口  
  -p, --publish=[]           指定容器暴露的端口 
  -h, --hostname=""          指定容器的主机名  
  -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录  
  --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录
  --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities  
  --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities  
  --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法  
  --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU  
  --device=[]                添加主机设备给容器,相当于设备直通  
  --dns=[]                   指定容器的dns服务器  
  --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件  
  --entrypoint=""            覆盖image的入口点  
  --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量  
  --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口  
  --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息  
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用  
  --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字  
  --net="bridge"             容器网络设置:
                                bridge 使用docker daemon指定的网桥     
                                host     //容器使用主机的网络  
                                container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源  
                                none 容器使用自己的网络(类似--net=bridge),但是不进行配置 
  --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities  
  --restart="no"             指定容器停止后的重启策略:
                                no:容器退出时不重启  
                                on-failure:容器故障退出(返回值非零)时重启 
                                always:容器退出时总是重启  
  --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)  
  --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理 
  • 示例:
[root@186 ~]# docker run -p 8090:8080 -p 50000:50000 --restart always --link Redis:redis --name jenkins -v /home/jenkins:/home/jenkins_home --privileged=true dokcer.io/jenkins/jenkins
     -p:把容器的8080端口映射到宿主机8090上
     -v:主机的目录/home/jenkins映射到容器的目录/home/jenkins_home
     --name:给容器起个名字jenkins,docker.io/jenkins/jenkins是你下载的镜像
     --restart:always 容器退出时总是重启
  --privileged=true:挂载主机目录Docker访问出现Permission denied的解决办法
     --link:为redis容器起个别名Redis,访问的时候使用别名Redis

四、主要命令使用实例

## 拉取/上传 pull---  从国外的官方镜像仓库拉取镜像,不指定版本就默认是最新版本,因为网速问题更推荐从国内阿里云等镜像获取。docker push推送本地镜像到服务器
[root@186 ~]# docker pull redis
Using default tag: latest
Trying to pull repository docker.io/library/redis ... 
latest: Pulling from docker.io/library/redis
1ab2bdfe9778: Pull complete 
966bc436cc8b: Pull complete 
c1b01f4f76d9: Pull complete 
8a9a85c968a2: Pull complete 
8e4f9890211f: Pull complete 
93e8c2071125: Pull complete 
Digest: sha256:9755880356c4ced4ff7745bafe620f0b63dd17747caedba72504ef7bac882089
Status: Downloaded newer image for docker.io/redis:latest


##镜像images---(images列出所有镜像,images -a列出所有镜像包括历史,images --tree显示镜像的所有层,rmi <IMAGE ID>删除一个镜像)
[root@186 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis     latest              f7302e4ab3a8        17 hours ago        98.2 MB
docker.io/nginx     latest              4733136e5c3c        24 hours ago        126 MB
docker.io/mysql     latest              62a9f311b99c        25 hours ago        445 MB
docker.io/centos    latest              9f38484d220f        5 months ago        202 MB

## 日志logs ---(查看某容器的日志)
[root@186 ~]# docker logs -f -t --tail 10 cc1084e70cab
2019-08-15T07:41:23.641939000Z [root@cc1084e70cab /]# df -h
2019-08-15T07:41:23.642167000Z Filesystem               Size  Used Avail Use% Mounted on
2019-08-15T07:41:23.642363000Z overlay                   10G  1.5G  8.6G  15% /
2019-08-15T07:41:23.642591000Z tmpfs                    487M     0  487M   0% /dev
2019-08-15T07:41:23.642778000Z tmpfs                    487M     0  487M   0% /sys/fs/cgroup
2019-08-15T07:41:23.642973000Z /dev/mapper/centos-root   10G  1.5G  8.6G  15% /etc/hosts
2019-08-15T07:41:23.643159000Z shm                       64M     0   64M   0% /dev/shm
2019-08-15T07:41:23.643346000Z tmpfs                    487M     0  487M   0% /proc/acpi
2019-08-15T07:41:23.643623000Z tmpfs                    487M     0  487M   0% /proc/scsi
2019-08-15T07:41:23.643863000Z tmpfs                    487M     0  487M   0% /sys/firmware


## 网络network---(create创建,inspect查看,disconnet网络中移除或断开某容器,rm删除)
[root@186 ~]# docker network create mynet
e78d79314337a7cb9a3acfb340f624272fcfb53126866c463c87d8d2d2cdb980
[root@186 ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "e78d79314337a7cb9a3acfb340f624272fcfb53126866c463c87d8d2d2cdb980",
        "Created": "2019-08-15T15:53:53.833288083+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
posted @ 2019-08-15 16:17  A学无止境A  阅读(470)  评论(0编辑  收藏  举报