docker

时间:2019-04-29 03:17:37  来源:igfitidea点击:

使用Linux容器

什么是Linux容器?

Linux容器(LXC)是一种轻量级的虚拟化方法。Linux容器通过具有自己的进程和网络空间的虚拟环境在操作系统级别提供虚拟化。使用LXC,无需虚拟机。Linux容器使您可以在沙盒环境(彼此隔离)中运行不同操作系统的多个容器。

什么是Docker?

Docker是基于容器的虚拟化工具,可让您轻松创建和管理容器。Docker是一个非常轻量级的虚拟化框架,提供以下功能:

  1. 与外界隔离的沙盒环境
  2. 可移植性-容器只是可以快速复制和移动的目录
  3. 轻巧-仅使用每个应用程序请求的资源

在以下示例中,我们将将Docker框架安装到Ubuntu 14.04 LTS(64位)环境中。

安装Docker-Ubuntu 14.04 LTS(64位)

首先,我们将使用以下命令更新存储库:

$ sudo apt-get update

接下来,我们执行安装命令:

$ sudo apt-get install docker.io

创建一个符号链接:

$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

验证Docker安装

验证我们的安装的最简单方法是实际尝试。在下面的测试中,我们将拉下一个Ubuntu图像并打开一个外壳。

$ sudo docker run -i -t ubuntu /bin/bash

我们可以通过在容器中执行以下命令来验证我们现在是否正在Ubuntu 14.04 LTS容器中运行:

显示与操作系统相关的信息:

root@594825c51052:/# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04 LTS
Release:	14.04
Codename:	trusty

请注意,root @后面的数字是容器ID。

ifconfig:显示网络接口信息:

john@ubuntu1404:~$ ifconfig
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::6010:2aff:fef4:ddb5/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:55 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1072 (1.0 KB)  TX bytes:8619 (8.6 KB)

请注意,在输出的第二行的开头指定了术语docker0

运行Fedora

如前所述,您不仅限于使用容器的单个操作系统。以下是正在使用的Fedora图像的快速示例:

john@ubuntu1404:~$ sudo docker.io run -i -t fedora /bin/bash
Unable to find image 'fedora' locally
Pulling repository fedora
b7de3133ff98: Pulling image (rawhide) from fedora, endpoint: https://cdn-registrb7de3133ff98: Download complete 
511136ea3c5a: Download complete 
ef52fb1fe610: Download complete 
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers cant use it. Using default external servers : [8.8.8.8 8.8.4.4]
bash-4.2# 

bash-4.2# cat /etc/fedora-release 
Fedora release 20 (Heisenbug)

docker info:显示Docker相关信息。该命令是从主机系统执行的

john@ubuntu1404:~$ sudo docker info
Containers: 1
Images: 23
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 25
Execution Driver: native-0.1
Kernel Version: 3.13.0-24-generic
WARNING: No swap limit support

显示Docker容器

要显示正在运行的Docker容器信息,您可以执行以下命令:

john@ubuntu1404:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

显示所有docker容器

john@ubuntu1404:~$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
594825c51052        ubuntu:14.04        /bin/bash           5 minutes ago       Exit 0                                  sharp_bohr

管理容器

在本节中,我们将研究如何控制容器。我们将使用以下命令创建一个容器:

$ JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello World; sleep 1; done")
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers cant use it. Using default external servers : [8.8.8.8 8.8.4.4]

上面的命令将在Ubuntu容器中运行一个简单的while true循环。

显示正在运行的容器

john@ubuntu1404:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
f49ff80088f5        ubuntu:14.04        /bin/sh -c while tru   About a minute ago   Up About a minute                       jolly_pasteur

停止容器

要停止容器,我们可以执行以下命令:docker stop及其后的Job ID:

john@ubuntu1404:~$ sudo docker stop $JOB
f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f

john@ubuntu1404:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ps命令可以看到我们的容器不再运行。

启动容器

我们可以通过执行以下命令来重新启动容器:docker start及其后的Job ID。

john@ubuntu1404:~$ sudo docker start $JOB
f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f

john@ubuntu1404:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
f49ff80088f5        ubuntu:14.04        /bin/sh -c while tru   4 minutes ago       Up 4 seconds                            jolly_pasteur

现在,我们可以看到容器再次运行。

杀死/停止容器

为了杀死正在运行的容器并将其永久删除,我们执行以下一系列命令:

john@ubuntu1404:~$ sudo docker kill $JOB
f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f

john@ubuntu1404:~$ sudo docker stop $JOB
f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f

john@ubuntu1404:~$ sudo docker rm $JOB
f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f

john@ubuntu1404:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

注意:要移走容器,必须先将其停止!

设置DNS设置-容器的域搜索顺序

要为所有Docker容器设置DNS服务器,我们可以使用命令 docker -d --dns 8.8.8.8

要为所有Docker容器设置DNS搜索域,我们可以使用命令 docker -d --dns-search example.com

Docker用户权限

默认情况下,普通用户无法执行docker命令,除非他们使用sudo选项来升级其特权。但是,可以通过将普通用户的用户标识添加到docker组来授予普通用户必要的权限。如果普通用户尝试运行docker命令并且他们不是docker组成员,则您将看到类似于以下消息:

john@ubuntu1404:~$ docker ps
2014/05/07 11:24:08 dial unix /var/run/docker.sock: permission denied

将用户添加到Docker组

要将用户添加到docker组,请执行以下命令:sudo usermod -a -G docker userid

john@ubuntu1404:~$ sudo usermod -a -G docker john

现在,如果我们执行groups命令以及相关的用户标识,我们将注意到我们似乎仍然不在docker组内。没关系,您需要做的就是注销然后重新登录。

注销之前:

john@ubuntu1404:~$ groups
john adm cdrom sudo dip plugdev lpadmin sambashare

注销并重新登录后:

john@ubuntu1404:~$ groups
john adm cdrom sudo dip plugdev lpadmin sambashare docker

现在您应该看到已添加组docker。现在您应该能够执行不带sudo前缀的docker命令:

john@ubuntu1404:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
11500463ac8a        fedora:20           /bin/bash           7 minutes ago       Exit 0                                  backstabbing_turing 

启动和停止Docker守护程序

要验证docker守护进程正在运行,我们可以使用status命令: sudo service docker.io status

停止docker守护我们使用命令:sudo service docker.io stop

要启动docker守护我们使用命令:sudo service docker.io start

要重新启动docker守护程序,我们可以使用以下命令:sudo service docker.io restart

john@ubuntu1404:~$ sudo service docker.io status
docker.io start/running, process 2656
john@ubuntu1404:~$ sudo service docker.io stop
docker.io stop/waiting
john@ubuntu1404:~$ sudo service docker.io start
docker.io start/running, process 2729
john@ubuntu1404:~$ sudo service docker.io restart
docker.io stop/waiting
docker.io start/running, process 2788

Docker命令

有关Docker中可用命令的列表,只需执行不带参数的docker命令。

可用的Docker命令列表

Commands:
    attach    Attach to a running container
    build     Build a container from a Dockerfile
    commit    Create a new image from a containers changes
    cp        Copy files/folders from the containers filesystem to the host path
    diff      Inspect changes on a containers filesystem
    events    Get real time events from the server
    export    Stream the contents of a container as a tar archive
    history   Show the history of an image
    images    List images
    import    Create a new filesystem image from the contents of a tarball
    info      Display system-wide information
    insert    Insert a file in an image
    inspect   Return low-level information on a container
    kill      Kill a running container
    load      Load an image from a tar archive
    login     Register or Login to the docker registry server
    logs      Fetch the logs of a container
    port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
    ps        List containers
    pull      Pull an image or a repository from the docker registry server
    push      Push an image or a repository to the docker registry server
    restart   Restart a running container
    rm        Remove one or more containers
    rmi       Remove one or more images
    run       Run a command in a new container
    save      Save an image to a tar archive
    search    Search for an image in the docker index
    start     Start a stopped container
    stop      Stop a running container
    tag       Tag an image into a repository
    top       Lookup the running processes of a container
    version   Show the docker version information
    wait      Block until a container stops, then print its exit code