赞
踩
我们知道一款产品从开发到上线,从开发环境到生成环境。作为开发和运维人员之间协作需要考虑很多问题,尤其是当我们的产品多版本迭代之后,不同环境之间的兼容就会成为一个大问题;
这时 Docker 的出现就解决了这一难题,Docker 的出现使我们开发的软件可以“带环境安装”,即安装的时候,可以把原始环境一模一样的的复制过来,不用在担心环境不一致导致“开发时可以正常运行,生成环境就会出问题”,“在我的机器上可以正常运行,在别人的机器上就不能运行”的问题了
Docker 就像是一个轻量级的虚拟机,Docker是一个轻量级的容器,我们可以将环境交给 Docker 来管理,当我们需要移植我们的产品的时候,就可以将环境整个的迁移到另一台主机上,而不向虚拟机一样,迁移一台虚拟机极其资源;
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
总之:Docker相较于虚拟机来说具有更加轻量,启动更快,效率更高,可移植性更强等优势,实现了“一次封装,到处运行”,不用在关心环境的不一致问题
运行环境的一致性:Docker 的镜像提供了除了内核之外完整的运行环境,确保了应用运行的一致性;
更快速地启动部署:可以做到秒级,甚至毫秒级的的启动时间。大大节约了开发、测试、部署的时间;
更好的隔离性:每个服务器都是独立运行的、完全隔离的。避免公用的服务器,资源会容易受到其他用户的影响;
弹性伸缩、快速扩展:能够更好的处理集中爆发式的服务器使用压力;
迁移更加方便:“带环境安装”;
持续交付和部署:使用 Docker 可以通过定制镜像来实现持续集成,交付,部署;
Docker 是一个 C/S 架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。
ubuntu 安装 docker 看这篇:Ubuntu下安装docker和docker-compose
CentOS7 自动安装 docker 看这篇:CentOS下安装docker和docker-compose
以下是 docker 手动安装:
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。 由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。
注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多补丁不支持更新。
cat /etc/redhat-release
gcc -v
,g++ -v
yum -y install gcc
,yum -y install gcc-c++
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
systemctl start docker
systemctl enable docker
docker version
docker run hello-world
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://8y2y8njn.mirror.aliyuncs.com”]
}
重新记载daemon,重启docker
systemctl daemon-reload
systemctl restart docker
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
常用的镜像加速器地址:
Docker Hub 类似与 Maven 仓库,是 Docker 的远程仓库
国内的 Docker 网站 https://www.docker.com
命令 | 解释 |
---|---|
systemctl start docker | 启动 Docker |
systemctl stop docker | 停止docker |
systemctl restart docker | 查看docker状态 |
systemctl status docker | 开机启动 |
systemctl enable docker | 开机启动 |
docker info | 查看docker概要信息 |
docker --help | 查看docker帮助文档 |
命令 | 解释 |
---|---|
docker images | 查看本地存在的镜像 这些镜像都存储在 Docker 的 /var/lib/docker目录下 |
docker search 镜像名称 | 从网络中查找需要的镜像 |
docker pull 镜像名称 | 将远程镜像拉取到本地 |
docker rmi [-f] 镜像ID | (强制)删除本地镜像 |
docker rmi -f 镜像名1:TAG 镜像名2:TAG | 删除多个镜像 |
docker rmi -f $(docker images -qa) | 删除所有镜像 |
使用:
docker images
docker search 镜像名字
docker pull 镜像名字
命令 | 解释 |
---|---|
docker ps | 查看正在运行的容器 |
docker ps -a | 查看所有容器 |
docker ps -l | 查看最后一次运行的容器 |
docker ps -f status=exited | 查看停止的容器 |
docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
–name:为创建的容器命名。
2.1.以交互的方式创建容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。可以理解成交互式容器是前台容器。
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
比如:docker run -it --name=mycentos centos:7 /bin/bash
docker run:表示创建容器
-it:表示运行容器并进入它的命令行
–name=mycentos:给当前的容器命名
centos:7:使用该镜像创建
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
2.2.创建后台容器
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
创建守护式容器:docker run -id --name=容器名字 centos:7
登录守护式容器:docker exec -it 容器名称 (或者容器ID) /bin/bash
2.3.停止与启动容器
docker stop 容器名称(或者容器ID)
docker start 容器名称(或者容器ID)
将宿主机的文件拷贝的容器的指定目录下
宿主机向容器拷贝:docker cp 需要拷贝的文件或目录 容器名称:容器目录
容器向宿主机拷贝:docker cp 容器名称:容器目录 需要拷贝的文件或目录
例如: docker cp /opt/tomcat8080/conf/web.xml mycentos7_2:/usr/local/
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器并挂载:docker run -id --name=mycentos1 -v 宿主机的目录:容器的目录 centos:7
创建容器并挂载 linux 中的 /usr/local/myhtml 到,容器的 /usr/local/myhtml 目录
docker run -id --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数
--privileged=true
来解决挂载的目录没有权限的问题
docker run -id --privileged=true --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7
我们可以通过 docker inspect 容器名称
来查看容器运行时的各种数据
当然我们也可以通过 docker inspect --format='{{属性的键}}' 容器名称
来查看单独某个属性
例如我们单独查看 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos1
docker rm 容器名称
当我们在删除一个正在运行的容器时,会报错;需要先关闭这个容器才可删除
当然我们也可以用 docker rm -f 容器名称
来强制删除一个容器
我们不能直接访问在 Docker 上部署的应用(包括 MySQL),如果我们想要访问我们部署在 Docker 上的应用,那么我们只需要访问 Docker 上部署的应用在宿主机上的映射端口即可,例如:我们在 Docker 上部署了一个 MySQL应用(3306),在宿主机上的映射端口为 33306,我们只需要访问 33306 端口,即可访问 Docker 上的 MySQL;
拉取镜像
docker pull centos/mysql-57-centos7
创建容器
docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
选项 | 解释 |
---|---|
-p 宿主机端口:容器端口 | 指定端口映射 |
-e … | 传递环境变量,这里表示 MySQL 的密码为 123456,账户默认为 root |
拉取镜像
docker pull tomcat:7-jre7
创建容器
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
找一个 web 项目,部署到宿主机的 /usr/local/webapps 目录下,然后进入 docker 容器查看项目有没有成功部署,最后在浏览器中测试看看能不能成功访问
输入默认的用户名之后,我们成功登录,说明项目已经部署成功了
拉取镜像
docker pull nginx
创建 Nginx 容器
docker run -di --name=mynginx -p 80:80 nginx
测试
拉取镜像
docker pull redis
创建容器
docker run -di --name=myredis -p 6379:6379 redis
用 redis 客户端工具链接测试
保存容器为镜像:docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i
保存镜像为 tar 文件:docker save –o tar文件名 镜像名
docker save -o mynginx.tar mynginx_i
加载 tar 文件为镜像:docker load -i tar文件名
docker load -i mynginx.tar
前面已经知道了,想要获得一个镜像可以从 Docker 中心仓库拉取,但是如果我们想要自己制作一个镜像,这时就需要 Dockerfile 了;
Docker 实际上就是一个文本文件,我们可以在这个文本文件里输入一些命令或参数,来定制我们需要的镜像,之后 Docker 可以通过读取 Dockerfile 文件的描述来构建镜像;
Dockerfile 常用的命令:
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) RUN 后面输入 linux 命令 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录(进入容器之后默认的工作路径) |
下面我们以创建一个具有 jdk1.8 的 centos7 系统为例制作一个镜像
创建目录
mkdir –p /usr/local/dockerjdk8
下载 jdk-8u144-linux-x64.tar.gz
并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8
目录
#依赖的镜像的名称和版本
FROM centos:7
#指定镜像创建者信息
MAINTAINER ayi
#设置工作目录,进入容器之后默认的工作目录,即进入 centos7 应用容器之后默认的工作目录为 /usr
WORKDIR /usr
#RUN yum install -y glibc.i686 制作完镜像之后,用镜像安装的centos7可能会有问题,缺少 glibc.i686,所以这里我们可以安装一下,也可以稍后安装
#RUN 后面是我们在构建镜像时需要执行的命令,下面是创建一个文件夹
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
docker build -t='jdk1.8' .
docker images
执行 java -version 发现报错,那么我们需要安装一下 glibc
yum install -y glibc.i686
安装完成之后,就可以了
Docker 中心仓库中维护着私有仓库的镜像,我们需要将其拉取下来,才能搭建我们自己的私有仓库
拉取私有仓库
docker pull registry
启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
这里我们就可以访问我们的私有仓库了
http://192.168.211.144:5000/v2/_catalog,IP 改为你们自己的宿主机 IP 即可
修改 daemon.json,
Docker 默认我们的私有仓库是不安全的,所以我们要配置一下,就和之前配置镜像加速一样
vi /etc/docker/daemon.json
"insecure-registries":["192.168.211.144:5000"]
IP,改为你们自己的宿主机 IP
重启docker 服务
systemctl restart docker
docker tag 自己的镜像名称 宿主机IP:私有服务容器的端口/jdk1.8
docker tag jdk1.8 192.168.17.132:5000/jdk1.8
5000:是我们之前创建 registry 的时候映射的端口,是宿主机的端口
再次启动私服容器
docker start registry
上传标记的镜像
docker push 192.168.211.144:5000/jdk1.8
docker pull 192.168.211.144:5000/jdk1.8
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。