Docker容器学习--1

Posted 鱼夫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器学习--1相关的知识,希望对你有一定的参考价值。

Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机( VM)额外的操作系统开销,提高资源利用率。

特点

1.更高效的利用系统资源
2.更快速的启动时间
3.一致的运行环境
4.更轻松的迁移
5.更轻松的维护和扩展 

 

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个


部署Docker环境:

 

环境准备:(centos7)

yum install -y docker         --安装
systemctl start docker        --启动Docker
systemctl enable docker       --加入开机自动启动  

docker 指令用法

直接敲入docker  ,会有很多Command选项,执行docker  【Command】 -h,如: docker  ps  -h  查看各个命令的详细用法

下载获取一个镜像

Docker 镜像仓库获取镜像的命令是 docker pull 。默认从Docker的镜像仓库下载 

docker pull centos      
将镜像保存到本地,可以上传到其他主机使用
[root@localhost www]# docker save centos > /docker/centos.tar.gz
[root@localhost www]# ls /docker/
centos.tar.gz

上传本地的镜像:
[root@localhost www]# docker load < /docker/centos.tar.gz

 查看镜像(查看镜像信息包括:镜像仓库、标签、镜像ID、创建时间、镜像大小)

[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              73acd1f0cfad        5 hours ago         109 MB
docker.io/centos    latest              2d194b392dd1        8 days ago          195 MB

其他一些查看镜像的指令:
查看所有镜像
[root@localhost ~]# docker image ls -a

查看在某个镜像之前的镜像
[root@localhost ~]# docker image ls -f before=nginx

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/centos latest 2d194b392dd1 8 days ago 195 MB
查看在某个镜像之后的镜像
[root@localhost ~]# docker image ls -f since=centos

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/nginx latest 73acd1f0cfad 5 hours ago 109 MB

  删除镜像(要删除的镜像不能被在用的容器调用,先停掉用该镜像的容器,再删除镜像)

[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              73acd1f0cfad        5 hours ago         109 MB
docker.io/centos    latest              2d194b392dd1        8 days ago          195 MB
[root@localhost ~]# docker image rm 73a        --ID不重复,只要前几位可以标识该镜像就可以

  启动一个容器:docker  run

[root@localhost ~]# docker run --name host -i -t -d  centos /bin/bash
c0d1bedfd1d08559f6e98a24a4bdfe6b7e90c59e9e852436c93ebdb68936eb48
--name:指定容器名称
-t :分配一个tty终端
-i :容器的标准输保持打开的状态
-d:后台运行
-p: 指令端口,启动应用容器时用到
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

   进入一个容器内部

[root@localhost ~]# docker exec -i -t host bash      --可以指定别名
[root@4117832e3e82 /]# exit    --退出容器
exit
[root@localhost ~]# docker exec -i -t 411 bash       --也可以指定 ID编号
[root@4117832e3e82 /]# hostname
4117832e3e82

  docker attach 指令进入容器,但是在容器中执行 exit 也会停止容器,所以最好使用 docker  exec 进入


 下面使用nginx的镜像创建一个容器,记录一下nginx容器的使用过程

 

查看镜像:
[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              73acd1f0cfad        21 hours ago        109 MB
docker.io/centos    latest              2d194b392dd1        9 days ago          195 MB
启动一个名为 mynginx 的容器:
[root@localhost ~]# docker run --name mynginx -i -t -d -p 80:80 nginx
2e98d20483b61879cf611b970e9fe15af2ca69049e6d6a6a1b7f44f318d1db07
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
2e98d20483b6        nginx               "nginx -g \'daemon ..."   13 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp   mynginx
[root@localhost ~]# 
进入mynginx容器:
[root@localhost ~]# docker exec -i -t mynginx bash
root@2e98d20483b6:/#
启动nginx服务:
root@2e98d20483b6:/# /etc/init.d/nginx start
root@2e98d20483b6:/# /etc/init.d/nginx status
[ ok ] nginx is running.

退出容器,并查看nginx状态:
[root@localhost ~]# ps -ef | grep nginx
root      2257  2242  0 01:29 pts/1    00:00:00 nginx: master process nginx -g daemon off;
101       2280  2257  0 01:29 pts/1    00:00:00 nginx: worker process
root      2375  2124  0 01:33 pts/2    00:00:00 grep --color=auto nginx

打开访问测试页

 

  2.还可以在docker host创建nginx的所需网页目录,这样就可以保存数据

在docker host创建网页文件目录,将容器中的目录挂载到docker host中
[root@localhost ~]# docker run --name webserver -d -i -t -p 80:80 -v /usr/share/nginx/html/:/usr/share/nginx/html/ nginx
88e92079d46ab17c0809401d153de1487f9d2c41093bd65057ce490b1c382b4a
[root@localhost ~]#
在docker host中写一个测试页
[root@localhost ~]# echo \'<h2>nginx test page for docker</h2>\' > /usr/share/nginx/html/index.html

访问测试页

  

停止、启动容器

[root@localhost ~]# docker ps -a     --查看所有已经创建的容器
[root@localhost ~]# docker stop ID
[root@localhost ~]# docker start ID

 

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e4ce0f90cdfb        nginx               "nginx -g \'daemon ..."   2 minutes ago       Up 2 minutes        80/tcp              nginx
[root@localhost ~]# docker stop e4ce   
e4ce
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# 

 

  删除容器 (要删除的容器必须是出于关闭状态)

[root@localhost ~]# docker rm ID     --删除容器

  

容器在运行时删除该容器会提示如下错误
[root@localhost ~]# docker rm e4c
Error response from daemon: You cannot remove a running container e4ce0f90cdfbe9013059cb48a6767c4a54e5347a5c184f61f562f4717a9b9f21. Stop the container before attempting removal or use -f

可以使用  -f  选项强制删除,在运行的容器也会删除

 

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下内容参考大神博客:http://www.cnblogs.com/kevingrace/p/5252929.html

 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。当你真正投入容器Docker的怀抱,不但可以发现它能解决很多问题,而且还具有众多的优点:

1)它是不可变的-操作系统,库版本,配置,文件夹和应用都是一样的。您可以使用通过相同QA测试的镜像,使产品具有相同的表现。  
2)它是轻量级的-容器的内存占用非常小。不需要几百几千MB,它只要对主进程分配内存再加上几十MB。  
3)它很快速-启动一个容器与启动一个单进程一样快。不需要几分钟,您可以在几秒钟内启动一个全新的容器。  

  但是,许多用户依然像对待典型的虚拟机那样对待容器,似乎都忘记了除了与虚拟机相似的部分,容器还有一个很大的优点:它是一次性的。  
这个“特性”本身促使用户改变他们关于使用和管理容器的习惯;下面将会说明下在容器中不应该做这些事,以确保最大地发挥容器的作用。

1)不要在容器中存储数据 – 容器可能被停止,销毁,或替换。一个运行在容器中的程序版本1.0,应该很容易被1.1的版本替换且不影响或损失数据。
有鉴于此,如果你需要存储数据,请存在卷中,并且注意如果两个容器在同一个卷上写数据会导致崩溃。确保你的应用被设计成在共享数据存储上写入。 2)不要将你的应用发布两份 – 一些人将容器视为虚拟机。他们中的大多数倾向于认为他们应该在现有的运行容器里发布自己的应用。
在开发阶段这样是对的,此时你需要不断地部署与调试;但对于质量保证与生产中的一个连续部署的管道,你的应用本该成为镜像的一部分。记住:容器应该保持不变。 3)不要创建超大镜像 – 一个超大镜像只会难以分发。确保你仅有运行你应用/进程的必需的文件和库。不要安装不必要的包或在创建中运行更新(yum更新)。 4)不要使用单层镜像 – 要对分层文件系统有更合理的使用,始终为你的操作系统创建你自己的基础镜像层,另外一层为安全和用户定义,
一层为库的安装,一层为配置,最后一层为应用。这将易于重建和管理一个镜像,也易于分发。 5)不要为运行中的容器创建镜像 – 换言之,不要使用“docker commit”命令来创建镜像。这种创建镜像的方法是不可重现的也不能版本化,应该彻底避免。
始终使用Dockerfile或任何其他的可完全重现的S2I(源至镜像)方法。 6)不要只使用“最新”标签 – 最新标签就像Maven用户的“快照”。标签是被鼓励使用的,尤其是当你有一个分层的文件系统。
你总不希望当你2个月之后创建镜像时,惊讶地发现你的应用无法运行,因为最顶的分层被非向后兼容的新版本替换,
或者创建缓存中有一个错误的“最新”版本。在生产中部署容器时应避免使用最新。 7)不要在单一容器中运行超过一个进程-容器能完美地运行单个进程(http守护进程,应用服务器,数据库),
但是如果你不止有一个进程,管理、获取日志、独立更新都会遇到麻烦。 8)不要在镜像中存储凭据。使用环境变量 –不要将镜像中的任何用户名/密码写死。使用环境变量来从容器外部获取此信息。 9)使用非root用户运行进程 – “docker容器默认以root运行。(…)随着docker的成熟,更多的安全默认选项变得可用。
现如今,请求root对于其他人是危险的,可能无法在所有环境中可用。你的镜像应该使用USER指令来指令容器的一个非root用户来运行。” 10)不要依赖IP地址 – 每个容器都有自己的内部IP地址,如果你启动并停止它地址可能会变化。如果你的应用或微服务需要与其他容器通讯,
使用任何命名与(或者)环境变量来从一个容器传递合适信息到另一个。

  

 

以上是关于Docker容器学习--1的主要内容,如果未能解决你的问题,请参考以下文章

docker学习之路 深入容器

Docker容器基础学习一

将 Docker 容器限制为单个 cpu 核心

Docker学习7-jenkins容器内安装python3

Docker容器学习整理

机器学习开发的灵药—Docker容器