Docker是一个开源的应用容器引擎,属于Linux容器的一种封装,是目前最流行的Linux容器解决方案。docker可以为任何应用创建一个轻量级、可移植的容器,然后容器可以运行在任何安装有docker的平台上。
Docker 的优势:
1、更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 docker 可以快速创建容器,快速迭代应用程序,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台。
4、更简单的管理
使用 docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
一、部署docker环境
1、安装yum相关工具包yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加docker下载源
(1)添加docker官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
(2)添加国内阿里云下载节点
注:国内连接docker官方提供的源下载速度比较慢,我这里使用的是阿里云的源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
3、安装docker
注:安装的是docker社区版本yum -y install docker-ce
4、更改镜像源为国内阿里云节点,并指定docker数据存储目录
mkdir -p /data/docker
mkdir -p /etc/docker
vim /etc/docker/daemon.json
注:docker安装好后默认没有此文件,需要手动创建,添加阿里云镜像节点,并指定docker存储目录
{
"registry-mirrors": ["https://registry.docker-cn.com"], "graph": "/data/docker"
}
5、启动docker,并加入开机启动
systemctl start docker
systemctl enable docker
6、测试
(1)下载hello-world镜像
docker pull hello-world
(2)运行hello-world镜像
docker run hello-world
这个image(镜像)运行后很简单,就是打印了这段话。告诉我们已经成功的让docker daemon(核心进程)从docker hub(镜像源)上拉了一个”hello-world”的image,并且通过这个image创建了一个container(容器),并且通过daemon将输出的内容传回了docker client(客户端)。
二、Docker架构
Docker使用客户端/服务器(C/S)架构模式,使用远程API来管理和创建docker容器。Docker Client向Docker daemon发起请求,Docker daemon负责构建、运行和分发容器。Docker client也可以通过socket或REST API与远程的Docker daemon通信。
- Docker daemon:服务端程序,以后台的方式运行。负责创建、运行、监控容器,构建、存储镜像。
- Docker client:Docker客户端,通过命令行或其他工具使用Docker API与Docker daemon通信。
- Images:Docker镜像,用于创建docker容器的模板,我们通过镜像来创建docker容器。
- Container:Docker容器,是从镜像创建的运行实例,每一个容器都相当于一个虚拟的应用环境,通过容器来运行各式各样的应用。
- Registry:存放Docker镜像的仓库,分为公有仓库和私有仓库两种。
三、Docker目录结构
Docker安装成功后,默认是没有存储目录的,在启动的时候才会创建存储目录。我们来看下docker都有哪些目录吧。
ls -lh /data/docker/
containerd目录里存放的是与daemon程序相关的数据。
image和overlay2目录里存放的是与镜像相关的数据。每下载一个镜像,就会在这两个目录下生成此镜像对应的子目录与数据;每运行一个镜像,即通过镜像创建一个容器,这两个目录下也会生成相关子目录与数据信息。
containers目录里存放的是容器相关的数据,每运行一个容器,就在这个目录下面生成一个容器Id对应的子目录与数据。
tmp是临时文件存放目录。
volumes与docker的数据卷相关,在此不进行扩展。
四、Docker命令使用
1、查看docker版本信息
docker -v #查看docker版本号
docker version #查看docker版本详细信息
2、查看docker系统信息
docker info
3、从镜像仓库查找镜像
docker search ubuntu #搜索包含ubuntu的镜像
4、下载镜像
docker pull ubuntu #下载ubuntu官方镜像
5、查看本地镜像
docker images
REPOSITORY:镜像名称,与镜像仓库上的名称一致
TAG:标记,下载的镜像默认会使用latest标记
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像占用磁盘空间大小
6、给本地镜像做个标记
docker tag ubuntu:latest ubuntu1:test #将ubuntu镜像的名称改为ubuntu1,标记改为test
注:使用docker images查看会多出来一行,修改后的image id和原来的一样,个人认为只是做了个标记而已,实际运行的话还是得运行ubuntu镜像,运行ubuntu1的话会报错。
7、通过镜像创建并启动容器
(1)以交互模式创建并启动一个容器
docker run --name ubuntu_test -it ubuntu /bin/bash
参数说明:
--name:为容器指定一个名称
-i:打开容器的标准输入,即以交互模式运行容器
-t:为容器分配一个伪终端
/bin/bash:表示运行bash shell,即运行命令行界面
此时已经进入到容器里的ubuntu系统,可以定制我们自己的应用容器,可安装配置应用软件,就跟实际环境一样部署自己的应用。
exit命令退出与容器的交互模式。
(3)以后台的方式创建并启动一个容器
docker run --name ubuntu_test1 -d ubuntu
注:返回容器的ID
(4)使用-P参数将80端口映射到主机随机端口
docker run -P -d nginx:latest #例如容器上启动了nginx,端口号为80
(5)使用-p参数指定映射端口,使用-v参数指定映射目录
docker run -p 8081:80 -v /data_test:/data -d nginx:latest
注:将容器的80端口映射到主机8081端口,将容器/data目录映射到主机/datatest目录
(6)将容器的端口映射到主机指定IP的端口上
docker run -p 192.168.2.226:8081:80 -d nginx:latest
8、查看容器信息
(1)查看所有容器
docker ps -a
CONTAINER ID:容器ID
IMAGE:属于哪个镜像
COMMAND:运行的命令、脚本或其他指令
CREATED:容器创建时间
STATUS:运行状态及运行了多长时间
PORTS:端口映射信息
NAMES:容器名称
(2)查看运行中的容器
docker ps
(3)查看最近创建的3个容器
docker ps -n 3
(4)查看所有容器的ID
docker ps -a -q
9、启动、停止、重启容器
注:可以指定容器ID,也可以指定容器名称
docker start 665b9b704983
启动之后STATUS会显示Up(运行)及运行了多长时间
docker stop 665b9b704983
docker restart ubuntu_test
10、删除容器
docker rm wizardly_albattani #不加参数只能删除已停止的容器
docker rm -f -v ubuntu_test #-f强制删除运行中的容器,-v删除与容器关联的数据卷
11、删除镜像
docker rmi ubuntu:latest
docker rmi -f ubuntu1:test #-f强制删除镜像,即使该镜像正被使用
12、杀掉一个运行中的容器
docker kill -s KILL ubuntu_test1 #-s "KILL" 表示向容器发送一个KILL信号
五、测试实例
1、下载centos的最新镜像
docker pull centos
2、创建并启动容器
docker run -itd --privileged --name centos_test -p 80:80 centos /usr/sbin/init
参数说明:
-itd:开启交互模式,分配一个伪终端,-d表示以后台方式运行
--privileged:使容器内的root拥有真正的root权限,可以看到很多host上的设备,甚至允许在容器中启动容器。
-p 80:80:将容器的80端口映射到宿主机(即本机)的80端口
/usr/sbin/init:启动init守护程序
3、登陆到此容器中
docker exec -it centos_test /bin/bash
参数说明:
exec:进入到一个运行中的容器里
-i:保持STDIN 打开,即开启交互模式
-t:分配一个伪终端
此时命令行提示符已经改变,主机名变成了容器id
4、在容器中安装httpd服务
yum -y install httpd
5、在容器中启动httpd服务,并加入开机启动
systemctl start httpd
systemctl enable httpd
6、退出容器exit
7、确保本机没有装httpd服务
rpm -qa | grep httpd
systemctl status httpd
8、在本机查看80端口是否已监听
ss -lnt | grep 80
9、在本机上查看httpd进程信息
ps -ef |grep httpd
千万不要搞混,此处的httpd进程不是本机的,而是容器里启动的httpd进程
10、配置firewalld防火墙允许80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
11、通过浏览器访问http://192.168.2.226
OK,能正常访问到apache的主页
12、把修改过的容器制作成镜像
docker commit -a "xuad.com" -m "xuad httpd" 6f42b25c1f00 centos/httpd:test
参数说明:
-a:提交的镜像作者信息
-m:镜像的说明文字
6f42b25c1f00:容器ID
centos/httpd:test:镜像名称和标记信息
转载于:https://blog.51cto.com/andyxu/2174652