目录
一、Docker 简介
Docker组成部分
二、Docker安装与启动 ★
配置阿里云镜像加速器
三、常用命令 ★★
1、总结
2、镜像相关命令
3、容器相关命令
4、应用部署 (Mysql、Redis、Nginx、Tomcat) ★
(3) Redis 部署 (挂载配置文件)
5、迁移与备份 ★
四、Docker 私有仓库
1、私有仓库搭建与配置
2、镜像上传至私有仓库
五、镜像发布 (上传阿里云) ★
学习目标:
- 掌握Docker基础知识,能够理解Docker镜像与容器的概念
- 完成Docker安装与启动
- 掌握Docker镜像与容器相关命令
- 掌握Tomcat Nginx 等软件的常用应用的安装
- 掌握docker迁移与备份相关命令
- 能够运用Dockerfile编写创建容器的脚本
- 能够搭建与使用docker私有仓库
Docker 帮助我们快速搭建环境,并且保证环境的一致性,避免了兼容等问题。
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验 , 这个时候 Docker 横空出世,是因为它对此给出了一个标准化的解决方案。
① Web 应用的自动化打包和发布
② 自动化测试和持续集成、发布
③ 在服务型环境中部署和调整数据库或其他的后台应用
使用Docker可以实现开发人员的开发环境、测试人员的测试环境、运维人员的生产环境的一致性。
什么是虚拟化?
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
镜像:类似虚拟机镜像 , 是一个特殊的文件系统
容器:类似linux系统环境,运行和隔离应用。是镜像运行时的实体
仓库:集中存放镜像文件的地方。
公共仓库:Docker Hub
(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
容器与虚拟机比较
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。
1. 确定你是CentOS7及以上版本
cat /etc/redhat-release |
2. yum 安装 gcc 相关
yum -y install gcc yum -y install gcc-c++ |
3. 安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2 |
4. 设置阿里云为镜像仓库 (外网仓库会超时)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
5. 更新yum软件包索引
yum makecache fast |
6. 安装DOCKER CE(社区版)(DOCKER EE企业版收费)
yum -y install docker-ce |
7. 启动docker
手动启动:systemctl start docker 自动启动:systemctl enable docker 检查版本:docker version |
8. 下载并运行HelloWorld
docker run hello-world |
输出这段提示以后,hello world就会停止运行,容器自动终止。
Hello from Docker!
这条消息显示您的安装工作正常。
为了生成此消息,Docker采取了以下步骤:
1. Docker客户端联系Docker守护进程。
2. Docker守护进程从Docker Hub拉出“hello-world”映像。
3. Docker守护进程根据该映像创建了一个新容器,该容器运行可执行文件,生成当前正在读取的输出。
8. 卸载
systemctl stop docker yum -y remove docker-ce rm -rf /var/lib/docker |
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine |
(之前的镜像是为了下载Docker本身,下面的镜像加速器为了加速下载的镜像)
1. 注意文件名:daemon!不是dea!
mkdir -p /etc/docker |
{
"registry-mirrors": ["https://n5gwxq4s.mirror.aliyuncs.com"]
}
2. 令配置生效,重启docker
systemctl daemon-reload |
拉取镜像
docker pull centos/mysql-57-centos7
docker pull tomcat:7-jre7 (拉取指定版本,:版本号)
docker pull nginx
docker pull redis
docker pull registry
注:镜像名、容器名均可用id替代
Docker | 命令 |
---|---|
启动docker: | systemctl start docker |
开机启动: | systemctl enable docker |
停止docker: | systemctl stop docker |
重启docker: | systemctl restart docker |
状态docker: | systemctl status docker |
查看docker概要信息: | docker info |
查看docker帮助文档: | docker --help |
镜像 (image) | 命令 |
---|---|
查看镜像: | docker images |
搜索镜像: | docker search 镜像名称 |
拉取镜像: | docker pull 镜像名称 |
删除镜像: | docker rmi 镜像ID 强制删除镜像:docker rmi -f 镜像ID 如果名字过长:docker rmi 镜像名:标签(版本) |
容器 (container) | 命令 |
---|---|
查看正在运行的容器: | docker ps |
查看所有容器: | docker ps –a |
查看最后一次运行的容器: | docker ps –l |
查看停止的容器: | docker ps -f status=exited |
交互式启动容器: | docker run -it --name=容器名称 镜像名称:标签(版本) /bin/bash |
后台启动容器: | docker run -id --name=mycentos2 centos:7 |
守护式启动容器: | docker run -id --name=容器名称 镜像名称:标签 |
启动容器: | docker start 容器名 |
停止容器: | docker stop 容器名 |
登录容器: | docker exec -it 容器名 /bin/bash docker attach 容器ID (鸡肋,守护式没有提示符) |
删除容器: | docker rm -f 容器名|id |
退出容器: | exit (交换式启动的容器,首次退出会自动停止) ctrl + p + q (容器不停止退出,守护式无法使用) |
重启容器: | docker restart 容器名 |
文件拷贝: | docker cp 宿主机目录 容器名称:容器目录 例:docker cp hello.txt mycentos2:/opt/ docker cp 容器名称:容器目录 宿主机目录 例:docker cp mycentos2:/opt/hello.txt /opt |
目录挂载 (创建容器并运行) |
docker run -di --name=容器的名字 -v 宿主机目录:容器目录 容器:标签(版本) 例:docker run -id --name=mycentos7_3 -v /a/b/c:/aa/bb centos:7 |
查看容器日志 | docker logs [OPTIONS] 容器名 -t :是加入时间戳 |
查看容器内运行的进程 | docker top 容器名 |
查看容器细节 |
docker inspect 容器名 只查看ip:docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名 |
迁移与备份 | 命令 |
---|---|
将容器保存为镜像 | docker commit 容器名 镜像名 |
将镜像备份为tar文件 | docker save –o tar文件名 镜像名 |
根据tar文件恢复为镜像 | docker load -i tar文件名 |
拉取镜像
docker pull centos/mysql-57-centos7
docker pull tomcat:7-jre7 (拉取指定版本,:版本号)
docker pull nginx
docker pull redis
docker pull registry
应用部署
Mysql:
# docker run -di --name=容器名字 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=mysql密码 容器名称
docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
Nginx:
docker run -di --name=mynginx -p 1111:80 nginx
Redis:
docker run -di --name=myredis -p 6379:6379 redis
镜像发布 (上传阿里云)
1. 登录阿里云Docker Registry
docker login --username=a11104255 registry.cn-hangzhou.aliyuncs.com
2. 从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/a11104255/repository:[镜像版本号]
3. 将镜像推送到Registry
docker login --username=a11104255 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/a11104255/repository:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/a11104255/repository:[镜像版本号]
镜像:Docker镜像是由文件系统叠加而成(是一种文件的存储形式);是docker中的核心概念,可以认为镜像就是对某些运行环境或者软件打的包,用户可以从docker仓库中下载基础镜像到本地,比如,开发人员可以从docker仓库拉取(下载)一个只包含centos7系统的基础镜像,然后在这个镜像中安装jdk、mysql、Tomcat和自己开发的应用,最后将这些环境打成一个新的镜像。开发人员将这个新的镜像提交给测试人员进行测试,测试人员只需要在测试环境下运行这个镜像就可以了,这样就可以保证开发人员的环境和测试人员的环境完全一致。
有多个引用,不允许删除,使用 docker rmi 镜像名:标签(版本号)
容器也是docker中的核心概念,镜像是创建容器的软件 , 容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java中类和对象的关系。
如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用。比如网站、程序甚至是系统环境。
创建容器命令:docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
文件拷贝
我们需要在容器内安装一个软件,软件首先需要有安装包,我们就需要把安装包拷贝到容器内。我们通常的操作是先把文件上传到宿主机,然后我们在将文件从宿主机拷贝到容器内的某个目录下面进行安装。先将文件拷贝到宿主机,再从宿主机拷贝到容器。
目录挂载
将宿主机的目录与容器内的目录进行映射,这样就可以保证我们两个目录的数据是同步的。
概念:
①数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据,在docker中我们使用卷。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 1:数据卷可在容器之间共享或重用数据
- 2:卷中的更改可以直接生效
- 3:数据卷中的更改不会包含在镜像的更新中
- 4:数据卷的生命周期一直持续到没有容器使用它为止
②数据卷容器:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
总结:
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
(1) MySQL部署
1. 拉取Mysql5.7镜像
docker pull centos/mysql-57-centos7
2. 应用部署
Mysql:
# docker run -di --name=容器名字 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=mysql密码 容器名称
docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
3. 远程登录
(2) Nginx 部署
1. 拉取镜像
docker pull nginx |
2. 创建Nginx容器 (注意端口,最好不要重复)
docker run -di --name=mynginx -p 1111:80 nginx |
3. 安装完成之后,请求nginx页面
宿主机id:映射ip
docker安装redis并以配置文件方式启动_祗是辉哥哥的博客-CSDN博客_docker安装redis
1. 拉取镜像
docker pull redis |
2. 创建配置文件,创建配置文件,修改配置
mkdir /usr/local/docker
vi /usr/local/docker/redis.conf
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
databases 16 #数据库个数(可选),我修改了这个只是查看是否生效。。
dir ./ #输入本地redis数据库存放文件夹(可选)
appendonly yes #redis持久化(可选)
3. 创建Redis 容器,挂载目录并启动
docker run -p 6379:6379 --name myredis -v /docker/redis/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes |
docker run -p 6379:6379 --name myredis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
--appendonly 开启AOF持久化(默认RDB)
docker run -di --name=myredis -p 6379:6379 redis (不用这个) |
4. 通过客户端工具连接测试。(redis 默认没有账号密码)
如果redis 重启后数据丢失问题,无法读取rdb、aof文件。
1、编辑 sysctl.conf 配置文件
vi /etc/sysctl.conf
2、检查sysctl.conf配置文件中的vm.overcommit_memory参数是否为0,若为0Linux系统不允许回写,可将参数vm.overcommit_memory = 1。(如果没有这个参数,则另起一行增加参数 vm.overcommit_memory 配置,如下):
vm.overcommit_memory = 1
3、使配置文件生效
sysctl -p
(4) Tomcat 部署 (一般不用)
1. 拉取镜像
docker pull tomcat:7-jre7 |
2. 创建容器
创建容器 -p表示地址映射 -v 表示目录挂载
# 创建tomcat容器;并挂载了webapps目录 |
可以保证环境的一致性,如开发环境、测试环境
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
1.拉取私有仓库镜像(此步省略)
docker pull registry
2.启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
通过 docker ps -a 查看容器是否创建成功
打开浏览器 输入地址 http://192.168.86.86:5000/v2/_catalog 确认私有仓库搭建成功
3. 修改daemon.json (注意逗号!)
"insecure-registries":["192.168.86.86:5000"]
4.重启docker 服务
systemctl restart docker
5.由于重启服务器导致容器停止,启动registry容器
docker start registry
1.标记此镜像为私有仓库的镜像
docker tag mynginx_i 192.168.86.86:5000/mynginx
2.上传标记的镜像
docker push 192.168.86.86:5000/mynginx
3.访问仓库,上传成功
4. 如何拉取?
docker pull 192.168.86.86:5000/mynginx
首先得去阿里云开发者平台进行注册并开通容器镜像服务。然后依次创建命名空间和仓库。
1.进入实例列表,创建个人实例
3.创建仓库 - 本地仓库
4.接下来按照参考文档进行
1.登入阿里云仓库,密码可以通过访问凭证进行设置。
docker login --username=a11104255 registry.cn-hangzhou.aliyuncs.com
2.从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/a11104255/repository:[镜像版本号]
3. 将镜像推送到Registry
docker login --username=a11104255 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/a11104255/repository:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/a11104255/repository:[镜像版本号]
备注:如果镜像id有重复如何删除