赞
踩
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
---------------------------------------------------------------------------------------------------------------------------------摘自《百度百科》
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LXC给出的方法是container,更细一点是kernel namespace
可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LXC则主要是利用cgroups来控制资源
移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
随着Docker在云计算市场中领先地位的日益稳固,容器技术也成为了一种主流技术;因为容器技术可实现不同云计算之间应用程序的可移植性,以及提供了一个把应用程序拆分为分布式组件的方法,此外,我们还可以管理和扩展这些容器成为集群。
一般来说,应用程序都是复杂的,它们都有很多的组件。例如,大多数应用程序都需要数据库或中间件服务的支持以实现对数据的存储、检索和集成。所以,需要通过设计和部署把这些服务拆分成为它们自己的容器。如果一个应用程序能够被拆分成为越多的分布式组件,那么应用程序扩展的选择则越多。但是,分布式组件越多也意味着管理的复杂性越高。
当执行应用程序迁移时,应尽量避免推倒重来的做法。搜索Docker注册库找到一个基本的Docker映像并将其作为应用程序的基础来使用;随着时间的推移,企业将会发现这些Docker注册库中基本映像的价值所在。请记住,Docker支持着一个Docker开发人员社区,所以项目的成功与否很大程度上取决于用户对于映像管理和改良的参与度。
安全性和管理应当是一个高优先级的考虑因素;企业用户不应再把它们当作应用程序迁移至容器的最后一步。反之,企业必须从一开始就做好安全性和管理的规划,把它们的功能纳入应用程序的开发过程中,并在应用程序运行过程中积极主动地关注这些方面。这就是企业应当花大功夫的地方。
基于容器的应用程序是分布式应用程序。企业应当更新较老的应用程序以支持联合身份管理方法,这将非常有利于确保分布式应用程序的安全性。为了做到这一点,应为每一个应用程序组件和数据提供一个的标识符,这个标识符可允许企业在一个细粒度的级别上进行安全性管理。企业用户还应当增加一个日志记录的方法。
为了创建镜像,企业用户需要使用一个Dockerfile来定义映像开发的必要步骤。一旦创建了映像,企业用户就应将其添加至Docker Hub。
应对在容器中运行的应用程序进行配置,以便于让应用程序知道可以在哪里连接外部资源或者应用程序集群中的其他容器。企业用户可以把这些配置部署在容器中或使用环境变量;对基于容器的应用程序进行测试类似于对其他分布式应用程序的测试。企业可以对每个容器进行组件测试,并将容器集群作为一个整体进行测试。 确定应用程序应如何能够在负载增加的情况下进行扩展。如果用户正在使用一个集群管理器(例如Swarm),则可测试其性能。
最后,把容器部署到实际生产环境中。为了积极主动地关注基于容器的应用程序的运行状况,可考虑实施必要的监控和管理机制 。确保打开日志记录功能。
很多应用程序迁移至云计算都是采用容器技术的。虽然迁移有一点复杂,但是容器可以保护应用程序投资并赋予了它一个更长的使用寿命。
类似虚拟机的镜像、用俗话说就是安装文件。
类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。
类似代码仓库,是Docker集中存放镜像文件的场所。
安装环境:Linux x86_64、CentOS7.6、Xshell 6
重建 Yum 缓存。
安装 Docker-CE ,请执行命令【sudo yum install docker-ce】进行安装
docker 命令与 Docker 引擎通讯之间通过 UnixSocket ,但是能够有权限访问 UnixSocket 的用户只有 root 和 docker 用户组的用户才能够进行访问,所以我们需要建立一个 docker 用户组,并且将需要访问 docker 的用户添加到这一个用户组当中来。
- tee /etc/yum.repos.d/docker.repo <<-'EOF'
- [dockerrepo]
- name=Docker Repository
- baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
- enabled=1
- gpgcheck=1
- gpgkey=https://yum.dockerproject.org/gpg
- EOF
创建容器要以镜像为基础,所以先讲下docker镜像的操作
目前机器里如果还没有镜像,可以直接去Docker Hub下载(当然镜像还可自定义,这里就不细说了)
通过命令【docker search java】还能指定具体的版本进行下载,
例如:docker search Ubuntu:1.2.5.4,可以进行搜docker Hub 会列出很多镜像
之后再执行以下命令【docker images】查看是否拉取成功.
注意:下载到本地的镜像要比docker Hub上搜索出来的要大,因为下载过程中自动解压了,在查看镜像列表就有了刚才下载的镜像;列表包含了仓库名,版本标签,镜像ID,创建时间以及所占用的空间
拉取镜像 | docker pull |
删除容器 | docker rm <容器名 or ID> |
查看容器日志 | docker logs -f <容器名 or ID> |
查看正在运行的容器 | docker ps (docker ps -a # 为查看所有的容器,包括已经停止的) |
删除所有容器 | docker rm $(docker ps -a -q) |
启动指定容器、 停止指定容器、 杀死指定容器 | docker start <容器名 or ID> # 启动容器; docker stop <容器名 or ID> # 停止容器; docker kill <容器名 or ID> # 杀死容器 |
查看所有镜像 | docker images |
拉取镜像 | docker pull <镜像名:tag> eg:以下代码 docker pull sameersbn/redmine:latest |
后台运行 | docker run -d <Other Parameters> eg:docker run -d -p 127.0.0.1:33301:22 centos6-ssh |
暴露端口 一共有三种形式进行端口映射 | docker -p ip:hostPort:containerPort # 映射指定地址的主机端口到容器端口 eg:docker -p 127.0.0.1:3306:3306 映射本机3306端口到容器的3306端口
docker -p ip::containerPort # 映射指定地址的任意可用端口到容器端口 eg:docker -p 127.0.0.1::3306 映射本机的随机可用端口到容器3306端口
docer -p hostPort:containerPort # 映射本机的指定端口到容器的指定端口 eg:docker -p 3306:3306 # 映射本机的3306端口到容器的3306端口 |
映射数据卷 | docker -v /home/data:/opt/data (这里/home/data 指的是宿主机的目录地址,后者则是容器的目录地址) |
eg:现在我们来创建一个只有Nginx应用的容器,首先我们先通过命令【docker pull docker.io/nginx】下载Nginx镜像.
注:下载到本地的镜像要比docker Hub上搜索出来的要大,因为下载过程中自动解压了,在查看镜像列表就有了刚才下载的镜像
列表包含了仓库名,版本标签,镜像ID,创建时间以及所占用的空间
下载后,可以通过命令【docker images】查看镜像是否下载成功
接下来我们就创建一个,只有Nginx应用的容器
启动一个使用镜像docker.io/nginx,名字叫container_nginx的容器,-p 8080:80表示将容器的80端口映射到主机的8080端口,这样我们只要访问主机的8080端口就可以访问到容器的服务了。
【docker run -it --name container_nginx -p 8080:8001 docker.io/nginx /bin/bash】
注:【-i:标准输入给容器】;【-t:分配一个虚拟终端】;【/bin/bash:执行bash脚本】;【name前面是两个-】;【 端口前面有-p】;【docker.io/nginx是镜像名】;【8080是主机的端口】;【80是Nginx应用的端口】
主机上的一个端口只能映射一个容器端口,不可以多个容器端口对应一个主机端口(如果容器安装的centos类的系统,那么容器端口随便设定,但如果容器内只是单纯的应用,那么容器端口要是应用自身的端口)
docker run -it --name container_nginx -p 8080:8001 docker.io/nginx /bin/bash
这样我们就创建并启动了一个容器!
exit 退出容器
docker ps 查看运行中的容器
docker ps -a 查看运行中和非运行中的所有容器
docker exec -it container_nginx /bin/bash 进入容器
如果容器还未启动 执行docker start container_nginx
进入容器后启动Nginx
whereis nginx 找Nginx的启动目录
[root@localhost software]# docker start container_nginx
container_nginx[root@localhost software]# docker exec -it container_nginx /bin/bash
root@f33c9a80cc35:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@f33c9a80cc35:/# /usr/sbin/nginx
注:如果访问不成功,可以先去虚拟机查看下防火墙的状态【system status firewalld】,如果防火墙未关闭,可以先暂时关闭【system stop firewalld】
最后再去浏览器访问 http://192.168.1.112:8080/ 就可以直接访问容器内的Nginx
容器删除之前先将容器停止
docker stop container_nginx 或者是容器的id
docker rm -f container_nginx 容器删除
docker start name 启动一个已经创建的容器
docker run 创建并启动一个容器docker run 命令其实是 docker create 和 docker start 的命令组合,先执行docker create 创建一个容器 再接着docker start启动
从主机复制到容器 sudo docker cp host_path containerID:container_path
从容器复制到主机 sudo docker cp containerID:container_path host_path请注意,以上这两个命令都是在主机中执行的,不能再容器中执行
docker cp container_nginx:/usr/local/xin.txt /usr/local/software/ 容器向主机复制文件
docker cp /usr/local/xinzhifu.txt container_nginx:/usr/local/ 主机向容器复制文件
扩展:那么其实镜像与容器的本质区别并不大,那么镜像可以生成容器 ,容器是否可以做成镜像呢?【肯定可以】
docket commit container_nginx image_nginx:v1 容器名 自己起一个镜像的名字:版本号eg: 我们用当前的容器生成了redis镜像
比方说有A、B两台机器,我都想安装redis,我在A机器上创建容器并在容器中做好redis的一切配置,然后将这个容器 ==> docker commit 成镜像image_redis,这时候我B机器也想要安装redis,我就可以直接用A机器生成的redis镜像,image_redis来直接创建容器,这样就可以使docker做一劳永逸的事;而且这相对于传统方式得在每台机器上安装配置redis那是简单得多了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。