0
点赞
收藏
分享

微信扫一扫

Docker 详细介绍

 

Docker核心组件

镜像 Images

容器 Container

仓库 Repository

Docker 镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统

镜像是创建容器的基础。


Docker容器

  Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。

容器可看做一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等),及运行在其中的应用程序打包而成的应用盒子。


Docker仓库 Repository类似于代码仓库,是Docker集中存放镜像的场所。



一、Docker服务安装、启动、停止

1.安装:CentOS 7: yum -y install docker

启动        service docker start

停止        service docker stop

重新启动    service docker restart

为避免每次使用docker命令都要用特权身份,可以将当前用户加入安装docker时自动创建的docker用户组

$sudo usermod -aG docker steven

另需要把steven加sudo权限

visudo -f /etc/sudoers 加入

steven ALL=ALL(ALL) ALL


修改后,su - steven切换到steven用户下,可用sudo启动、停止、重新启动docker服务  

启动        sudo service docker start

停止        sudo service docker stop

重新启动    sudo service docker restart


其它docker操作直接执行命令即可。例如 docker images 、docker ps、 docker run等


[steven@localhost ~]$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nginx               latest              3f8a4339aadd        3 days ago          108MB

gitlab/gitlab-ce    latest              905f149c0946        3 weeks ago         1.38GB

registry            latest              177391bcf802        4 weeks ago         33.3MB

hello-world         latest              f2a91732366c        5 weeks ago         1.85kB

[steven@localhost ~]$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[steven@localhost ~]$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES

98b70681d201        nginx               "nginx -g 'daemon of…"   2 days ago          Exited (0) 12 minutes ago                       nginx

[steven@localhost ~]$ docker start 98b70681d201

98b70681d201



二、 镜像

1.镜像获取

 docker pull  

例如获取 ubuntu 14.04  

docker pull ubuntu:14.04


2.镜像上传

 docker push


3.镜像查看

 a.docker images

[root@localhost ~]# docker images

REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

docker.io/gitlab/gitlab-ce   latest              8b77e7f764d5        13 days ago         1.368 GB

docker.io/jenkins            latest              5fc84ab0b7ad        2 weeks ago         808.9 MB

 

  b. docker inspect 镜像名称

     可获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。


4.镜像删除

a. docker rmi 镜像id


b. docker rmi 镜像标签


5. 使用history命令查看镜像历史。镜像由多个层组成。该命令将列出各层的创建信息

  docker history ubuntu:14.04


6. 搜索镜像  

  docker search --automated -s 3 nginx

7. 创建镜像

 a. 基于已有镜像的容器创建 docker commit

   docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

   如创建一个test文件,再退出

   $docker run -it ubuntu:14.04 /bin/bash

   #touch test

   #exit

容器ID为 a925cb40b3f0

 b docker commit -m "Added a new file" -a "Docker new" a925cb40b3f0 test:0.1


 基于本地模板导入

  cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04


6. 存出镜像

   docker save -o ubuntu_14.04.tar ubuntu:14.04

7. 载入镜像

  docker load --input ubuntu_14.04.tar

  docker load <  ubuntu_14.04.tar


三、images镜像创建



在Dockerfile当前目录创建镜像

sudo docker build -t "ouruser/sinatra:v2" .


导出容器

sudo docker export 17de96f79c7e > devel.tar

导入容器快照

cat devel.tar | sudo docker import - test/devel:v1.0




四、 容器

1.容器是镜像的一个带有额外的可写文件层的运行实例。

Docker容器就是独立运行的一个或一组应用,以及它们的必需运行环境。


2.创建容器 docker create

$sudo docker create -it ubuntu:latest

docker create新建的容器处于停止状态,可用docker start来启动它


3.新建并启动容器 docker run=docker create + docker start

启动容器有两种方式,一是基于镜像新建一个容器并启动,另一个是将在终止状态(stopped)的容器重新启动。


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

root@af8bae53bdd3:/#


这里的ubuntu:14.04是镜像名称, ubuntu是镜像名称、14.04是镜像tag

-t 选项让Docker分配一个伪终端 (pseudo-tty)并绑定到容器的标准输入上,  

-i 则让容器的标准输入保持打开


docker run后加 -d 让容器在后台以守护态运行

$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"


4.启动、停止、重启

docker start/stop/restart 容器ID

例如:docker start/stop/restart a6961e6a3f56


5.查看容器信息

查看正在运行的容器 docker ps

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS                                                             NAMES

a6961e6a3f56        gitlab/gitlab-ce    "/assets/wrapper"   2 weeks ago         Up 20 hours (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp   gitlab

               

查看所有容器

docker ps -a


6.查看容器日志

docker logs 容器ID

例如:sudo docker logs a6961e6a3f56


7.进入容器

a. docker attach命令

$sudo docker run -idt ubuntu

$sudo docker ps

容器names为nostalgic_hypatia

$sudo docker attach nostalgic_hypatia

root@243c32535da7:/#


使用attach命令不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法操作。


b. docker exec (Docker 1.3版本起)

$sudo docker exec -ti 243c32535da7 /bin/bash

root@243c32535da7:/#


8.删除容器

docker rm [OPTIONS] CONTAINER

支持的选项包括:

-f, --force=false   强行终止并删除一个运行中的容器

-l, --link=false    删除容器的连接,但保留容器。

-v, --volumes=false 删除容器挂载的数据卷。

 

9、导入和导出容器

a.导出容器

docker export CONTAINER  

$sudo docker export ce5 >test_for_run.tar

$sudo docker export e81 >test_for_stop.tar

可将这些文件传输到其他机器上,在其他机器上通过导入命令实现容器的迁移

b.导入容器  

docker import 导入一个容器快照到本地镜像库

$cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0

$sudo docker images


容器快照、镜像存储文件(load)的区别

容器快照文件将丢弃所有的历史记录和元数据信息(即公保存容器当时的快照状态),

而镜像存储文件将保存完整记录,体积也要大。

另外从容器快照文件导入时可重新指定标签等元数据信息



10. 在docker和宿主机之间复制文件


1.用-v挂载主机数据卷到容器内  


docker run -v /path/to/hostdir:/mnt $container  

在容器内拷贝  

cp /mnt/sourcefile /path/to/destfile  


2.直接在主机上拷贝到容器物理存储系统  

3.用输入输出符

具体方法这篇文章写的很详细:http://blog.csdn.net/yangzhenping/article/details/43667785


但是对这三种方法我都不太喜欢,无意间看到另位一种方法供大家参考:


从主机复制到容器sudo docker cp host_path containerID:container_path


从容器复制到主机sudo docker cp containerID:container_path host_path


容器ID的查询方法想必大家都清楚:docker ps -a



五、docker 容器启动以后如何动态修改内存大小和cpu资源


1.docker ps查看正在运行的容器

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS                                                             NAMES

a6961e6a3f56        gitlab/gitlab-ce    "/assets/wrapper"   2 weeks ago         Up 4 minutes (health: starting)   0.0.0.0:80->80/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp   gitlab


2.停止此容器

[root@localhost ~]# docker stop a6961e6a3f56

a6961e6a3f56


3.用docker update更新此容器所使用的内存和交换内存

[root@localhost ~]# docker update --memory=3096m --memory-swap=4072m a6961e6a3f56

a6961e6a3f56


4.启动此容器

[root@localhost ~]# docker start a6961e6a3f56


5.docker update --help查看docker update命令说明

[root@localhost ~]# docker update --help


Usage: docker update CONTAINER [CONTAINER...]


Update configuration of one or more containers


 --blkio-weight          Block IO (relative weight), between 10 and 1000

 -c, --cpu-shares        CPU shares (relative weight)

 --cpu-period            Limit CPU CFS (Completely Fair Scheduler) period

 --cpu-quota             Limit CPU CFS (Completely Fair Scheduler) quota

 --cpuset-cpus           CPUs in which to allow execution (0-3, 0,1)

 --cpuset-mems           MEMs in which to allow execution (0-3, 0,1)

 --help                  Print usage

 --kernel-memory         Kernel memory limit

 -m, --memory            Memory limit

 --memory-reservation    Memory soft limit

 --memory-swap           Swap limit equal to memory plus swap: '-1' to enable unlimited swap

 --restart               Restart policy to apply when a container exits


六、仓库



七、数据管理

容器中管理数据主要有两种方式

 数据卷(Data Volumes)

 数据卷容器(Data Volume Containers)


1.数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可提供很多有用的特性:

 数据卷可在容器之间共享和重用。

 对数据卷的修改会立即生效。  

 对数据卷的更新,不会影响镜像

 卷会一直存在,直到没有容器使用。

 数据卷的使用,类似Linux下对目录或文件进行mount操作。

 

a.在容器内创建一个数据卷

 使用trainnig/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/webapp

 -P 是允许外部访问容器需要暴露的端口

 $ sudo docker run -d -P --name web -v /webapp trainnig/webapp python app.py

b. 挂载一个主机目录作为数据卷

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp trainnig/webapp python app.py

 上面的命令加载主机的 /src/webapp目录到容器的/opt/webapp目录  

Docker挂载数据卷的默认权限是读写(rw),用户也可通过 ro指定为只读

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro trainnig/webapp python app.py


c.挂载一个本地主机文件作为数据卷

 $ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

 这样就可记录在容器中输入过的命令历史了。

 推荐的方式是直接挂载文件所在的目录。


2.数据卷容器

若用户需在容器之间共享一些持续更新的数据,可用数据卷容器

a.创建一个数据卷容器并创建一个数据卷挂载到/dbdata

$ sudo docker run  -it -v /dbdata --name dbdata ubuntu  

root@3ed94f279b6f:/#

root@3ed94f279b6f:/# ls

可在其他容器中使用--volumes-from 来挂载dbdata容器中的数据卷

$ sudo docker run  -it --volumes-from dbdata --name db1 ubuntu

$ sudo docker run  -it --volumes-from dbdata --name db2 ubuntu

容器db1和db2都挂载同一个数据卷到相同的/dbdata。三个容器任一容器在该目录下的写入,其他容器都可看到。

 

3.利用数据卷容器迁移数据

  可利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

   

  a.备份

  $ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

   利用ubuntu镜像创建一个容器worker.使用--volumes-from dbdata来让worker容器挂载dbdata容器的数据卷;

    用-v $(pwd):/backup 挂载本地的当前目录到worker容器的/backup目录

    worker容器启动后,用tar cvf /backup/backup.tar /dbdata 将/dbdata下内容备份为容器内的/backup/backup.tar


  b.恢复

    先创建一个带有数据卷的容器dbdata2

    $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

    再创建一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中

    $ sudo docker run  --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar


八、网络基础配置

 1.端口映射实现访问容器

  a.从外部访问容器应用

  可通过 -P 或 -p参数来指定端口映射. 当用-P时,Docker会随机映射一个49000~49900的端口到容器内部开放的网络端口

  $ sudo docker run -d -P training/webapp python app.py

  docker ps 可看到本地主机的49155被映射到容器的5000端口

 

  b.映射所有接口地址

    使用hostPort:containerPort

    $ sudo docker run -d -p 5000:5000 training/webapp python app.py

   

  c.映射到指定地址的指定端口

    $ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

   

  d.映射到指定地址的任意端口

    $ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

    还可用udp来指定udp端口

    $ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

   

 2.容器互联

   使用 --link参数可让容器之间安全的进行交互

   建一个数据库容器

   $ sudo docker run -d --name db training/postgres

   创建一个web容器,并将它连接到db容器

   $ sudo docker run -d -P --name web --link db:db training/webapp python app.py

    --link参数的格式为 --link name:alias name是要链接的容器的名称, alias是这个连接的别名


  Docker通过两种方式为容器公开连接信息:

  环境变量

  更新 /etc/hosts文件

  $ sudo docker run --rm --name web2 --link db:db training/webapp env



九、Docker swarm/Docker Service

docker service 服务查看、创建、日志、显示、检查状态等


[root@docker-ms01 galaplat-order-center]# docker service --help


Usage: docker service COMMAND


Manage services


Commands:

 create      Create a new service

 inspect     Display detailed information on one or more services

 logs        Fetch the logs of a service or task

 ls          List services

 ps          List the tasks of one or more services

 rm          Remove one or more services

 rollback    Revert changes to a service's configuration

 scale       Scale one or multiple replicated services

 update      Update a service


 

举报

相关推荐

0 条评论