他是一个容器
Docker可以帮助用户构建和部署容器,用户值需要把自己的应用程序或者服务打包放进容器即可。
容器是基于镜像启动的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段
总结起来,docker容器就是:
- 一个镜像格式
- 一系列标准操作
- 一个执行环境
Docker资源
安装docker
Linux(ContOs)安装
- 使用命令 uname -a 确认内核是否是3.8以上版本
- 使用命令sudo grep device-mapper /proc/devices 或ls -l /sys/class/misc/device-mapper/ 检查是否有Device Mapper(作为docker的存储驱动,为docker提供存储能力)
- vi /etc/sysconfig/selinux 将selinuxg改为disabled SELINUX=disabled
- yum install -y docker 下载docker
- systemctl start docker contos7启动docker
- 如果失败报: Error starting daemon: SELinux is not supported with the overlay2 graph driver on ...=false),两个解决方案:
- 启动新的内核
- docker配置文件里面里禁用selinux,--selinux-enabled=false
vim /etc/sysconfig/docker
- docker info 查看docker是否启动
- 将docker守护进程绑定到宿主机上的网络接口,直接设置DOCKER_HOME环境变量来达到永久有效的方式:export DOCKER_HOST="tcp://0.0.0.0:2375"
- 检测守护进程是否启动,如果没启动会报没有运行的错误,下列表格为启动的效果
[root@node129 ~]# service docker stop Redirecting to /bin/systemctl stop docker.service [root@node129 ~]# service docker start Redirecting to /bin/systemctl start docker.service |
Windows安装
自动安装
- 首先要确定安装了curl命令,如果没装,执行 yum -y install curl
- 执行命令:curl https://get.docker.com/ | sudo sh
Docker入门
在进行操作前一定要确认docker程序已运行,功能是否正常,执行命令:docker info
该命令会返回所有容器和镜像的数量,Docker使用执行驱动和存储驱动以及Docker的基本配置。
而docker是基于客户端-服务器的架构,它有一个docker程序,既能作为客户端也能作为服务器端。作为客户端时,docker程序向Docker守护进程发送请求,然后在对返回的请求结果做处理。
创建一个容器
- docker run -i -t ubuntu /bin/bash 创建一个ubuntu容器(重官方提供的版本中拉取)
其中 /bin/bash命令启动了一个Bash shell,下列图就是用root用户登录到a5312w03eafc容器中。这是一个完整的ubuntu系统
简单概述一下创建容器的全过程
首先docker会查询本地是否存在ubuntu镜像,如果没有就去我们配置的镜像网址去找(默认是Docker Hub官网上的地址),找到后会下载到本地宿主机中,随后,Docker在文件系统内部用这个镜像创建了一个新的容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口,最后我们就可以使用这个容器了。
使用容器
简易操作,及命令安装等
我们现在使用a5312w03eafc容器(ubuntu)中root用户对他进行操作
所有命令跟该操作系统一致
hostname 查看主机名
查看hosts配置文件,下列图中明显可以看出来自动给他配了一个ip地址172.17.0.2
之后会发现docker提供的这个镜像是真的难用,里面大部分命令都没有,比如ip、vim等,执行以下命令
apt-get update 更新
apt-get install vim -y vim文本编辑器
apt-get install net-tools ifconfig和ping命令
安装完成后,检查网络配置,如下图,这里有lo的环回接口,有一个172.17.0.2的标准eth0网络接口,和普通的宿主机一模一样
检查容器进程
关闭容器
输入exit返回宿主机时,容器已经停止运行了!只有在指定的/bin/bash命令处于运行状态的时候,我们的容器才会运行。一旦退出,/bin/bash命令也就结束了,这时容器也随之停止运行,但是容器还是存在的。运行docker ps -a查看容器列表
修改容器名称
docker rename confident_brahmagupta dyc_docker_test
启动关闭的容器
docker start dyc_docker_test 通过容器名启动
docker start a5312e03eafc 通过ID启动
docker stop dyc_docker_test 通过容器名关闭
docker stop a5312e03eafc 通过ID关闭
附着到正在运行的容器上
docker attach dyc_docker_test
当容器重新启动时,会沿用docker run命令时指定的参数,因此我们的容器重新启动后会运行一个交互式会话shell,此外,也可以用docker attach 命令,重新附着到该容器会话上
创建守护式容器
上面介绍的是交互式运行的容器,也可以创建长期运行的容器。守护式容器,没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器
docker run --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
-d 的意思是后台运行,在这里使用了脚本语言循环去输出“hello world”,而且这边没有将主机的控制台附着到新的容器中,先查看在运行的容器 docker ps(没有加a的参数就只显示正在运行的容器)
容器日志
docker logs dyc_docker_sh 显示最新的log
docker logs -f dyc_docker_sh 跟踪守护式容器log
docker logs -ft dyc_docker_sh 跟踪守护式容器log加上了时间
还可以在创建的时候使用日志驱动,但这个时候在使用docker log就打印不出来日志了,日志已经全部重定向到Syslog中,如:
docker run --log-driver --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
如果是在Docker Toolbox中运行Docker,应该在虚拟机中启动Syslog守护进程
查看容器内进程
docker top dyc_docker_sh
docker统计信息
如果你想在守护式中使用交互命令就必须使用以下命令,-t -i表示我们执行的进程创建了TTY并捕捉STDIN,注意使用交互命令时用exit退出该容器也继续在运行,不会退出,守护式容器只能使用docker stop dyc_docker_sh停止,整体流程如第二幅图:
docker exec -t -i dyc_docker_sh /bin/bash
容器自动重启
docker run --restart=always --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
--restart=always 无论退出代码是什么都会重启
--restart=on-failure:5 错误代码为非0时重启,且重启次数最多为5次
获取容器信息的不且是 docker ps还可以使用docker inspect dyc_docker_sh来获取更为信息的信息
简单的对docker容器进行部署、操作以及基本的工作原理演示
使用Docker的镜像和仓库
什么是docker镜像
Docker镜像是由文件系统叠加而成的,最低端是一个引导文件系统(bootfs),但是我们几乎不会跟引导文件打交道,当一个容器启动后,它会被移到内存中,而引导文件则会被卸载。
第二层是root文件系统(rootfs),它位于引导文件系统之上,rootfs可以是一种或多种的操作系统,在传统的Linux系统中root文件系统最先以只读的方式加载,等引导结束并且检查完毕后,才改成可读写模式,而在docker中,root文件系统只能是只读状态,并且在利用联合加载技术,在root文件系统层上加载更多的只读系统文件。联合加载指的是一次同时加载多个文件系统,但是外面看起来只能看到一个文件系统,联合加载会将各层文件系统叠加在一起,这样最终的文件系统会包含所有底层的文件和目录。
Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部, 位于下面的镜像称之为父镜像。依次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像。最后,当一个容器启动时,docker会在该镜像的最顶层加载一个读写文件系统。我们想在docker中运行的程序就是在这个读写层中执行的。
列出镜像
本地镜像都保存在Docker宿主机的 /var/lib/docker目录下,镜像是从仓库下载的,仓库位于Registry中。默认的Registry是在Docker提供运营的Docker Hub上
获取所有镜像列表:docker images
目前只有一个,我们在拉取一个Ubuntu 18.10镜像
查看镜像
- 直接从docker hub上查询
- 使用docker命令:docker search ubuntu
构建镜像
- 首先需要去docker gub上面注册一个账号,
- 注册完成后在linux上输入命令: sudo docker login
- 按提示输入之前注册好的账号密码,在这里可能会出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 错误,该错误是因为我们设置的dns有问题,请把他配置成8.8.8.8(谷歌),登陆成功,如下图
他会把用户的个人信息保存到~/.docker/config.json中
使用commit构建新镜像
- sudo docker run -i -t ubuntu /bin/bash 拉取或进入镜像中
- 为这个镜像安装apache2 apt-get -yqq update apt-get -y install apache2
- 构造一个新的镜像
- sudo docker commit ef6b519b1fe3 ubuntu_dyc/apache2 ( docker ps -l -q 可以查到刚刚使用的镜像ID)
- sudo docker images ubuntu_dyc/apache2 查看新构建的镜像
使用Dockerfile构建镜像
在这里并不推举使用commit构建镜像,推举使用dockerfile的定义文件和docker build命令来构建镜像,他比commit构建镜像更具备可复制性、透明性及冥等特性
使用dockerfile的步骤:
- 创建一个存放Dockerfile的文件夹,并编写Dockerfile文件
- mkdir static_web
- cd static_web
- touch Dockerfile
- vim Dockerfile
FROM ubuntu:14.04 MAINTAINER dyc "919325340@qq.com" RUN apt-get update && apt-get install -y nginx RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html EXPOSE 80 |
- docker build -t dyc/static_web:v1 .
执行build命令时,Dockerfile中所有的指令都会被提交,并且在该命令成功结束后返回一个新镜像,其中dyc为仓库名static_web镜像名v1是标签 请注意上面的命令 dyc.static_web 后面还有一个点. 这个代表他执行的位置,.代表当前目录
- 查看镜像是否存在
问题总结
1.
- docker对contos7的兼容度不够,初始contos的内核是3.10版本,必须进行升级,升级后,内核为:CentOS Linux release 7.6.1810 (Core)
- yum clean all
- Yum update
命令收集
service docker start | 开启服务 | |
service docker stop | 关系服务 | |
docker info | 查看docker基本信息 | |
docker version | 查看版本号 | |
docker run -i -t ubuntu /bin/bash | 创建新容器 | |
docker image ls | 查看镜像文件 | |
Docker rmi -f 镜像ID | 删除镜像 | |
docker rm 容器名 | 删除容器 | |
docker container ls | 列出hello-world在显示其消息后退出的容器(由图像生成) | |
docker ps -a | 查看容器列表 | |
docker run --name xxx -i -t ubuntu /bin/bash | 创建一个名称为xxx的容器,如果未加命名,则用容器ID代替 | |
docker rename 原容器名 新容器名 | 修改容器名称 | |
docker start 容器名(ID名) | 启动容器 | |
docker stop 容器名(ID名) | 关闭容器 | |
docker attach dyc_docker_test | 交互式容器如果启动后,附着到正在运行的容器上 | |
docker run --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" | 创建守护式容器 -d为后台运行的意思 | |
docker logs dyc_docker_sh docker logs -f dyc_docker_sh docker logs -ft dyc_docker_sh
| 显示最新的log 跟踪守护式容器log 跟踪守护式容器log加上了时间
| |
docker run --log-driver --name dyc_docker_sh -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" | 启用日志驱动,使日志重定向到Syslog中去,在使用docker logs 命令将差不到日志 | |
docker pull fedora:20 |
| |
sudo docker login | 登陆docker账号,如果没有创建,请到docker gub上注册 | |
Sudo docker commit 镜像ID ubuntu_dyc/apa | Commit方式构建新镜像 | |
sudo docker build -t dyc/static_web:v1 . | 首先创建Dockerfile文件,并编辑该文件之后 使用Dockerfile创建镜像,后面的点是相对路径 |