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      
将镜像保存到本地,可以上传到其他主机使用
[[email protected] www]# docker save centos > /docker/centos.tar.gz
[[email protected] www]# ls /docker/
centos.tar.gz

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

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

[[email protected] ~]# 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

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

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

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

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

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

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

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

[[email protected] ~]# 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
[[email protected] ~]# docker image rm 73a        --ID不重复,只要前几位可以标识该镜像就可以

  启动一个容器:docker  run

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

进入一个容器内部

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

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

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

查看镜像:
[[email protected] ~]# 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 的容器:
[[email protected] ~]# docker run --name mynginx -i -t -d -p 80:80 nginx
2e98d20483b61879cf611b970e9fe15af2ca69049e6d6a6a1b7f44f318d1db07
[[email protected] ~]# 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
[[email protected] ~]#
进入mynginx容器:
[[email protected] ~]# docker exec -i -t mynginx bash
[email protected]:/#
启动nginx服务:
[email protected]:/# /etc/init.d/nginx start
[email protected]:/# /etc/init.d/nginx status
[ ok ] nginx is running.

退出容器,并查看nginx状态:
[[email protected] ~]# 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中
[[email protected] ~]# docker run --name webserver -d -i -t -p 80:80 -v /usr/share/nginx/html/:/usr/share/nginx/html/ nginx
88e92079d46ab17c0809401d153de1487f9d2c41093bd65057ce490b1c382b4a
[[email protected] ~]#
在docker host中写一个测试页
[[email protected] ~]# echo ‘<h2>nginx test page for docker</h2>‘ > /usr/share/nginx/html/index.html

访问测试页


  

停止、启动容器

[[email protected] ~]# docker ps -a     --查看所有已经创建的容器
[[email protected] ~]# docker stop ID
[[email protected] ~]# docker start ID
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e4ce0f90cdfb        nginx               "nginx -g ‘daemon ..."   2 minutes ago       Up 2 minutes        80/tcp              nginx
[[email protected] ~]# docker stop e4ce
e4ce
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[[email protected] ~]#

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

[[email protected] ~]# docker rm ID     --删除容器

  

容器在运行时删除该容器会提示如下错误
[[email protected] ~]# 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地址,如果你启动并停止它地址可能会变化。如果你的应用或微服务需要与其他容器通讯,使用任何命名与(或者)环境变量来从一个容器传递合适信息到另一个。

  

原文地址:https://www.cnblogs.com/anay/p/8571062.html

时间: 2024-11-04 04:02:12

Docker容器学习--1的相关文章

Docker容器学习梳理--容器登陆方法梳理(attach、exec、nsenter)

对于运行在后台的Docker容器,我们运维人员时常是有登陆进去的需求.登陆Docker容器的方式: 1)使用ssh登陆容器.这种方法需要在容器中启动sshd,存在开销和攻击面增大的问题.同时也违反了Docker所倡导的一个容器一个进程的原则. 参考Docker容器学习梳理--SSH方式登陆容器 2)使用自带命令docker attach登陆容器.命令格式:docker attach container_id.不过docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所

Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)

自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker.前面已经在Docker容器学习梳理--基础知识(2)这一篇中详细介绍了Docker的网络配置以及pipework工具. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的

docker容器学习一

Docker 学习一 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低. 适合运维工程师及后端开发人员,通过学习你可以一步一步了解 Docker 的使用. 在阅读前,你需要掌握 Linux 的常用命令.你

Docker容器学习

Docker学习 docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 优点:1.提高效率,方便快捷(容器系统资源开销低) 2.沙箱机制,互不干扰 3.集群部署,负载均衡 Client docker CLI(命令行界面工具的客户端)-->REST API-->docker daemon(服务器,守护进程) swarm:docker容器的集群和调

Docker容器学习梳理-容器硬盘热扩容

docker容器默认的空间是10G,如果想指定默认容器的大小,可以在docker配置文件里自定义,比如配置成--storage-opt dm.basesize=20G,即容器设置成20G:也可以在启动容器的时候指定:# docker -d --storage-opt dm.basesize=20G 在实际生产环境下,对docker容器进行热扩容(动态扩容)是非常重要的一个需求,但是上面的方法需要修改后需要重启docker,无法做到动态给运行容器指定大小. Docker容器动态扩展的优点: 1)不

Docker容器学习梳理--小知识点补充

之前已经梳理了Docker的相关使用事项,这里再补充一些,以便加深掌握程度.1)docker run指令 [[email protected] ~]# docker run --help : docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -a, --attach=[] Attach to STDIN, STDOUT or STDERR --add-host=[] Add a custo

docker容器学习二

Docker 架构 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建. 容器与镜像的关系类似于面向对象编程中的对象与类. Docker 面向对象 容器 对象 镜像 类 Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板. Docker 容器(Container) 容器是独立运行的一个或一组应用. Docker 客户端(Client) Docker 客户端通

Docker容器学习与分享02

1.docker容器的创建 首先运行一个centos容器,感受一下Docker容器的便捷 首先先看一下镜像仓库 发现仓库里没有镜像,也就是没有创建容器的模板,这时考虑从REPOSITORY中拉取镜像(Docker分享01中提到REPOSITORY是用来存放镜像的仓库,而REPOSITORY仓库分为公有仓库(Docker Hub)和私有仓库,公有仓库即所有人都可以分享使用,而私有仓库是个人使用). 在公有仓库中搜索centos镜像 这时会列出所有的镜像,优先考虑官方镜像,然后将它拉取到本地. 这样

Docker容器学习整理

一.使用Docker镜像1.1 docker常用命令1.2 创建镜像1.3 存出和载入镜像1.4 上传镜像 二.操作docker容器2.1 创建容器2.2 终止容器2.3 进入容器2.4 删除容器2.5 导入和导出容器 三.访问Docker仓库 一.docker基本管理1.1 docker常用命令1.1.1 docker images # 列出本机已有镜像1.1.2 tag命令添加镜像标签1.1.3 docker inspect 查看镜像详细信息1.1.4 history 查看镜像历史1.1.5