Docker容器

什么是Docker

Docker容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

Docker的用途

1)快速交付你的应用程序
Docker可以为你的开发过程提供完美的帮助。Docker允许开发者在本地包含了应用程序和服务的容器进行开发,之后可以集成到连续的一体化和部署工作流中。
举个例子,开发者们在本地编写代码并且使用Docker和同事分享其开发栈。当开发者们准备好了之后,他们可以将代码和开发栈推送到测试环境中,在该环境进行一切所需要的测试。从测试环境中,你可以将Docker镜像推送到服务器上进行部署。

2)开发和拓展更加简单
Docker的以容器为基础的平台允许高度可移植的工作。Docker容器可以在开发者机器上运行,也可以在实体或者虚拟机上运行,也可以在云平台上运行。
Docker的可移植、轻量特性同样让动态地管理负载更加简单。你可以用Docker快速地增加应用规模或者关闭应用程序和服务。Docker的快速意味着变动几乎是实时的。

3)达到高密度和更多负载
Docker轻巧快速,它提供了一个可行的、符合成本效益的替代基于虚拟机管理程序的虚拟机。这在高密度的环境下尤其有用。例如,构建你自己的云平台或者PaaS,在中小的部署环境下同样可以获取到更多的资源性能。
这里写图片描述

一个完整的Docker有以下几个部分组成:

dockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器

安装Docker


实验环境:

Selinux iptables off
Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)

(因为docker需要的版本较高,低版本会安装失败,所以我们使用7.3版本)


1.下载安装docker:

[root@foundation8 Desktop]# yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm -y

2.打开docker服务

[root@foundation8 Desktop]# systemctl start docker

3.docker的相关命令

[root@foundation8 ~]# docker info                     # docker宿主机的信息
[root@foundation8 ~]# docker version                  # docker的版本
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:36:45 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:36:45 2017
 OS/Arch:      linux/amd64
 Experimental: false

现有镜像的导入和容器的使用

镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是
增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。

镜像管理的相关命令

# docker search                    查询镜像
# docker pull                      拉取镜像
# docker push                      推送镜像
# docker save ubuntu > ubuntu.tar  导出镜像
# docker load -i ubuntu.tar        导入镜像
# docker commit                    更新镜像
# docker rmi                       删除镜像

1.导入镜像

[root@foundation8 Desktop]# docker load -i game2048.tar 
011b303988d2: Loading layer  5.05 MB/5.05 MB
36e9226e74f8: Loading layer 51.46 MB/51.46 MB
192e9fad2abc: Loading layer 3.584 kB/3.584 kB
6d7504772167: Loading layer 4.608 kB/4.608 kB
88fca8ae768a: Loading layer 629.8 kB/629.8 kB
Loaded image: game2048:latest

2.查看镜像

[root@foundation8 Desktop]# docker images game2048
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
game2048            latest              19299002fdbe        20 months ago       55.5 MB

容器管理的相关命令

# docker run -it --name vm1 ubuntu bash     创建容器
# docker ps -a                              查看容器进程
# docker attach vm1                         连接容器
# docker top vm1                            查看容器进程
# docker logs vm1                           查看容器指令输出  -f 参数可以实时查看
# docker inspect vm1                        查看容器详情
# docker stats vm1                          查看容器资源使用率
# docker diff vm1                           查看容器修改
# docker run -d --name vm1 ubuntu bash -c "while true; do echo westos; sleep 1; done" 
                                            后台运行
# docker stop vm1                           停止容器
# docker start vm1                          启动容器
# docker kill vm1                           强制干掉容器
# docker restart vm1                        重启容器
# docker pause/unpause vm1                  暂停/恢复容器
# docker rm vm1                             删除容器
# docker export vm1 > vm1.tar               导出容器
# docker import vm1.tar image               导入容器为镜像 image

3.运行docker

[root@foundation8 Desktop]# docker run -d --name vm1 game2048    # -d打入后台  --name表示为这个容器起的名字是vm1
99d04995f5381736a417e3911e578468b7cf6f372718235dbc6168c8aed71210

4.查看vm1容器的ip

[root@foundation8 Desktop]# docker inspect vm1                  # 查看容器详情

                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"


[root@foundation8 Desktop]# ip addr                             # 查看ip

9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ab:60:64:ed brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:abff:fe60:64ed/64 scope link 
       valid_lft forever preferred_lft forever
11: veth77e1d70@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 8e:24:fb:4d:4d:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::8c24:fbff:fe4d:4db9/64 scope link 
       valid_lft forever preferred_lft forever

5.在本机浏览器中输入该ip,访问该容器网址(需要注意的是:这个172.17.0.2是自己私有的ip地址,别人不能访问)

这里写图片描述

6.为了别人可以访问到,我们可以对ip地址进行映射,用nginx的镜像举例

对内:
这里写图片描述

对外:
这里写图片描述

7.删除镜像

[root@foundation8 Desktop]# docker stop vm1            # 停止vm1容器
vm1
[root@foundation8 Desktop]# docker container prune     # 删除
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
99d04995f5381736a417e3911e578468b7cf6f372718235dbc6168c8aed71210

Total reclaimed space: 4.074 kB

网络拉取镜像:阿里云镜像加速器

1.输入:www.aliyun.com,点击注册–>注册帐号–>登陆—->管理控制台—>点击产品与服务–>容器镜像服务,点击镜像加速器查看配置文件
这里写图片描述

2.编辑/etc/docker/daemon.json文件

[root@foundation8 Desktop]# mkdir -p /etc/docker
[root@foundation8 Desktop]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://ywf2cvt1.mirror.aliyuncs.com"]
}

2.重启服务

[root@foundation8 Desktop]# systemctl daemon-reload
[root@foundation8 Desktop]# systemctl restart docker

创建成功后可以进行查找对应的镜像

[root@foundation8 docker]# docker search nginx
NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                                  Official build of Nginx.                        9323      [OK]       
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1386                 [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   609                  [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as...   396                  [OK]
kong                                                   Open-source Microservice & API Management ...   216       [OK]       
webdevops/php-nginx                                    Nginx with PHP-FPM                              111                  [OK]
kitematic/hello-world-nginx                            A light-weight nginx container that demons...   108                  
zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server ...   63                   [OK]
bitnami/nginx                                          Bitnami nginx Docker Image                      57                   [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          43                   [OK]
linuxserver/nginx                                      An Nginx container, brought to you by Linu...   38                   
tobi312/rpi-nginx                                      NGINX on Raspberry Pi / armhf                   20                   [OK]
blacklabelops/nginx                                    Dockerized Nginx Reverse Proxy Server.          12                   [OK]
nginxdemos/nginx-ingress                               NGINX Ingress Controller for Kubernetes . ...   11                   
wodby/drupal-nginx                                     Nginx for Drupal container image                10                   [OK]
webdevops/nginx                                        Nginx container                                 8                    [OK]
nginxdemos/hello                                       NGINX webserver that serves a simple page ...   8                    [OK]
centos/nginx-18-centos7                                Platform for running nginx 1.8 or building...   7                    
1science/nginx                                         Nginx Docker images that include Consul Te...   4                    [OK]
centos/nginx-112-centos7                               Platform for running nginx 1.12 or buildin...   4                    
pebbletech/nginx-proxy                                 nginx-proxy sets up a container running ng...   2                    [OK]
toccoag/openshift-nginx                                Nginx reverse proxy for Nice running on sa...   1                    [OK]
travix/nginx                                           NGinx reverse proxy                             1                    [OK]
mailu/nginx                                            Mailu nginx frontend                            1                    [OK]
ansibleplaybookbundle/nginx-apb                        An APB to deploy NGINX                          0                    [OK]

3.拉取镜像

[root@foundation8 Desktop]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
be8881be8156: Pull complete 
32d9726baeef: Pull complete 
87e5e6f71297: Pull complete 
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Status: Downloaded newer image for nginx:latest
[root@foundation8 Desktop]# docker images nginx           # 查看镜像

4.创建容器

[root@foundation8 Desktop]# docker run -d --name vm1 nginx
8b5a11af91dac05030ba3f38b981bf7e1be3c5fd60397d32fbb8e4e04ed5cb61

ctrl+pq将容器打入后台 ctrl+d关闭容器

[root@foundation8 ~]# docker run -it nginx bash              # 进入容器
root@e5e31339f4e7:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@e5e31339f4e7:/# [root@foundation8 ~]#                   # ctlr+pq退出之后,重新连接容器
[root@foundation8 ~]# docker container attach vm1
root@e5e31339f4e7:/# exit                                    # Ctrl+d退出并关闭容器
[root@foundation8 ~]# docker container attach vm1            # 无法进入容器
You cannot attach to a stopped container, start it first
[root@foundation8 ~]# docker start vm1                       # 开启容器
vm1
[root@foundation8 ~]# docker container attach vm1
root@e5e31339f4e7:/# 

拉取到nginx镜像之后,我们希望在物理主机向容器中的nginx服务传送html发布主页,我们该怎么做呢?
第一种传送首页的方法:在本地远程拷贝

[root@foundation8 Desktop]# vim index.html

<h1>www.westos.org</h1>

[root@foundation8 Desktop]# docker cp index.html vm1:/usr/share/nginx/html
[root@foundation8 Desktop]# docker inspect vm1

                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"

第二种传送首页的方法:在物理主机打开容器时-v挂载

[root@foundation8 Desktop]# cd /tmp/
[root@foundation8 tmp]# mkdir docker
[root@foundation8 tmp]# cd docker/
[root@foundation8 docker]# mkdir web
[root@foundation8 docker]# cd web/
[root@foundation8 web]# ls
[root@foundation8 web]# docker stop vm1
vm1
[root@foundation8 web]# docker container prune            # 移除所有停止的容器
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
8b5a11af91dac05030ba3f38b981bf7e1be3c5fd60397d32fbb8e4e04ed5cb61
2bc6db45884ff96071582631844b686c5e5cdb004329926d1d6cccc26bb75a0c

Total reclaimed space: 24 B
[root@foundation8 web]# vim index.html

<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>

[root@foundation8 web]# docker run -d --name vm1 -v /tmp/docker/web:/usr/share/nginx/html nginx           # 在本地导入nginx的默认发布目录,-v表示把宿主机的目录挂载到容器中
64f77462c1b03a1ebcc843a662b0ac09bf597b4fd76cdb39c407bb41d698667a

这里写图片描述

数据卷和数据卷容器

在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。
容器中数据管理主要有两种方式:数据卷和数据卷容器。

数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。

数据卷

数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。
数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。

数据卷的特性

数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
数据卷可以在容器之间共享和重用
可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
对数据卷的更新不会影响镜像的更新
数据卷会一直存在,即使挂载数据卷的容器已经被删除

[root@foundation8 web]# docker stop vm1
vm1
[root@foundation8 web]# docker rm -f vm1
vm1
[root@foundation8 web]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro nginx bash
## 创建一个容器
## -v:挂载
## /tmp/data1:/data1  将宿主机的目录/tmp/data1影射到容器中的/data1目录
## /data1 默认可读写 /data2 只读
## 将宿主机/etc/yum.repos.d/dvd.repo文件映射到容器/etc/yum.repos.d/dvd.repo文件,可以使用yum源,但不能进行修改
root@845749407d5c:/# ls
bin   data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  data2  etc  lib   media  opt  root  sbin  sys  usr
root@845749407d5c:/# cd /etc/yum.repos.d/
root@845749407d5c:/etc/yum.repos.d# ls
dvd.repo
root@845749407d5c:/etc/yum.repos.d# cd /data2/
root@845749407d5c:/data2# touch file                # /data2只读
touch: cannot touch 'file': Read-only file system
root@845749407d5c:/data2# cd /data1/                # /data1可读写
root@845749407d5c:/data1# touch file
root@845749407d5c:/data1# ls
file

在宿主机的/tmp目录对目录data1,data2进行操作
[root@foundation8 ~]# cd /tmp/
[root@foundation8 tmp]# cd data1/
[root@foundation8 data1]# touch file1
root@845749407d5c:/data1# ls
file  file1
root@845749407d5c:/data1# rm -f file1
[root@foundation8 data2]# touch file2
root@845749407d5c:/data2# ls
file2
root@845749407d5c:/data2# rm -fr file2
rm: cannot remove 'file2': Read-only file system
[root@foundation8 web]# docker rm -f vm1
vm1

数据卷容器

用户需要在多个容器之间共享一些数据,就可以使用数据卷容器。
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫数据卷容器。
在容器中创建一个数据卷

[root@foundation8 web]# docker create --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro nginx bash
2862fe11c05aa528746a5190887043111c34c2420ccab76c3c2deb5d7bf2ac34
[root@foundation8 web]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2862fe11c05a        nginx               "bash"              47 seconds ago      Created                                 datavol
[root@foundation8 web]# docker run -it --name vm1 --volumes-from datavol nginx bash
root@52465d9c7fb5:/# ls
bin   data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  data2  etc  lib   media  opt  root  sbin  sys  usr
root@52465d9c7fb5:/# cd /data1/
root@52465d9c7fb5:/data1# ls
file
root@52465d9c7fb5:/data1# cd /data2/
root@52465d9c7fb5:/data2# ls
file2
root@52465d9c7fb5:/data2# cd /etc/yum.repos.d/
root@52465d9c7fb5:/etc/yum.repos.d# ls
dvd.repo
root@52465d9c7fb5:/etc/yum.repos.d# exit
[root@foundation8 web]# docker run -it --name vm2 -v /tmp/backup:/backup nginx bash
root@222e9142b5a5:/# ls
backup  boot  etc   lib    media  opt   root  sbin  sys  usr
bin dev   home  lib64  mnt    proc  run   srv   tmp  var
[root@foundation8 web]# docker run --rm -v /tmp/backup:/backup ubuntu tar cf /backup/etc.tar /etc
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
c64513b74145: Pull complete 
01b8b12bad90: Pull complete 
c5d85cf7a05f: Pull complete 
b6b268720157: Pull complete 
e12192999ff1: Pull complete 
Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Status: Downloaded newer image for ubuntu:latest
tar: Removing leading `/' from member names
[root@foundation8 web]# cd /tmp/backup/
[root@foundation8 backup]# ls
etc.tar
[root@foundation8 backup]# docker run -d --name vm1 game2048
[root@foundation8 backup]# docker inspect vm1 | grep Pid
            "Pid": 12886,
            "PidMode": "",
            "PidsLimit": 0,

[root@foundation8 backup]# ps ax

12886 ?        Ss     0:00 /bin/sh -c sed -i "s/ContainerID: /Containe

[root@foundation8 backup]# cd /proc/
[root@foundation8 proc]# cd 12886/
[root@foundation8 12886]# ls
attr             environ    mem            pagemap      stat
autogroup        exe        mountinfo      personality  statm
auxv             fd         mounts         projid_map   status
cgroup           fdinfo     mountstats     root         syscall
clear_refs       gid_map    net            sched        task
cmdline          io         ns             schedstat    timers
comm             limits     numa_maps      sessionid    uid_map
coredump_filter  loginuid   oom_adj        setgroups    wchan
cpuset           map_files  oom_score      smaps
cwd              maps       oom_score_adj  stack
[root@foundation8 12886]# cd ns
[root@foundation8 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation8 ns]# ll
total 0
lrwxrwxrwx 1 root root 0 Aug 19 15:11 ipc -> ipc:[4026532399]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 mnt -> mnt:[4026532397]
lrwxrwxrwx 1 root root 0 Aug 19 15:08 net -> net:[4026532402]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 pid -> pid:[4026532400]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 uts -> uts:[4026532398]
[root@foundation8 ns]# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.0021cc7099f2   no      enp0s25
                            vnet0
                            vnet1
                            vnet2
                            vnet3
                            vnet4
                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker容器是一种轻量级、可移植的虚拟化技术,用于在操作系统级别隔离应用程序和其依赖的运行环境。通过使用Docker容器,可以将应用程序及其所有依赖项打包到一个独立的、可移植的容器中,然后在任何支持Docker的环境中运行。 以下是一些常见的Docker容器相关概念和工具: 1. Docker镜像(Docker Image):Docker镜像是一个只读的模板,包含了运行应用程序所需的所有文件和依赖项。可以通过Docker镜像创建Docker容器。 2. Docker容器Docker Container):Docker容器Docker镜像的运行实例。每个Docker容器都是相互隔离的,具有自己的文件系统、进程空间和网络接口。 3. Docker引擎(Docker Engine):Docker引擎是Docker的核心组件,负责管理和运行Docker容器。它包括了一个守护进程(dockerd)和一组命令行工具(docker命令)。 4. Docker Compose:Docker Compose是一个用于定义和管理多个Docker容器的工具。通过编写一个YAML文件来描述应用程序的各个组件及其依赖关系,然后使用docker-compose命令来启动、停止和管理这些容器。 5. Kubernetes:Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。它可以与Docker结合使用,提供了更高级的容器编排和管理功能。 6. Docker Hub:Docker Hub是一个公共的Docker镜像仓库,可以从中获取各种预构建的Docker镜像。同时,也可以将自己构建的镜像推送到Docker Hub上进行分享和存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值