本片博客是我在自学docker所产出的笔记,希望对正在学习docker的朋友有所帮助!
1.Docker的简介
2.Docker安装与启动
3.常用命令
4.应用部署
5.迁移与备份
6.Dockerfile
7.Docker私有仓库
在计算机中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,给予抽象,转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理组态所限制,一般所指的虚拟化资源包括计算能力和资料储存。
在实际的生成环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化利用物理硬件,对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化,硬件虚拟化,内存虚拟化,网络虚拟化,桌面虚拟化,服务虚拟化,虚拟机等
Docker是一个开源的项目,诞生于2013年初,最早是dotCloud公司内部的一个业余项目。它是基于Google公司推出的Go语言实现。项目后来加入来Linux基金会,遵从来Apache2.0协议,项目代码在GitHub上进行维护
认识Docker(logo)
为什么要使用Docker(好处)
(1)上手快
用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复 制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码 即改”的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即 可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机 中也可以运行更多的s容器,使用户尽可能的充分利用系统资源。
(2)职责的逻辑分类
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心 如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要 部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境 都是正常的,上线后出了问题就归结为肯定是运维的问题)”(3)快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应 用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子, 里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒 子中一件件的取。)
(4)鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个 应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序 或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调 试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中 运行多个应用程序)
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层 面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小
Docker是一个客户端和服务器(C/S)架构的诚信。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程完成所有工作并返回结果。Docker提供一个命令工具Docker以及一整套RESTFul API。你可以在同一台宿主机上运行Docker守护进程和客户端也可以从本地的Docker客户端连接到另一台Docker守护进程
我们可以将镜像理解为类,容器理解为对象
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker 公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保 存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
https://hub.docker.com/
Docker官方建议我们是基于Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新的一些补丁包
我们将在Docker安装到CentOS上。在这里建议安装在CentOS7.x以上版本,在CentOS6.x版本中,安装前需要安装其他很多的环境而起Docker很多补丁不支持更新
安装步骤:
1.yum包更新到最新
sudo yum update
2.安装需要的软件包,yum-util提供的yum-config-manager功能,另外两个是devicemapper驱动依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.设置yum源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.安装docker
sudo yum install docker-ce
5.安装后查看docker版本
docker -v
ustc是老牌的Linux镜像服务提供者,还远在ubuntu5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务
编辑该文件(没有需要自己创建)
vi /etc/docker/daemon.json
在该文件中输入以下内容:
注意:刚安装好的docker它的这个daemon.json文件是空的
{ "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }
systemctl命令是系统服务管理器指令
启动docker
systemctl start docker
停止docker
systemctl stop docker
重启docker
systemctl restart docker
查看docker状态
systemctl status docker
查看docker概要信息
docker info
查看docker帮助文档
docker --help
docker images
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像ID
CREATED:镜像的创建日期(不是获取镜像的日期)
SIZE:镜像大小
这些镜像都是存储在Docker宿主机的
/var/lib/docker
目录下
如果需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
拉取镜像就是从中央仓库中下载镜像到本地
docker pull 镜像名称
例如,我要下载一个centos7的镜像
docker pull centos:7
按镜像ID删除镜像
docker rmi 镜像ID
删除所有镜像
docker rmi `docker images -q`
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
查看停止的容器
docker ps -f status=exited
创建容器常用的参数说明:
创建容器的命令:
docker run
-i
:表示运行容器
-t
:表示容器启动后会进入其他命令行,也可以理解为交互。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端
--name
:为创建的容器名称
-v
:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v
做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
-d
:在run
后面加上-d
参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i
-t
两个参数,创建后会自动进入容器)
-p
:表示端口映射,前者是宿主机端口,后者是容器的映射端口。可以使用多个-p
做多个端口映射1.交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签/bin/bash # 例如 docker run -it --name=jiangnan mysql:/bin/bash
这时我们通过ps命令查看发现可以看到启动的容器,状态为启动状态
退出当前容器,输入命令后会退回到当前宿主机,并且容器的状态会变成停止
exit
交互式方式创建容器的结论:我们以交互式的方式来创建和运行容器,当我们退出的时候容器也自动停止了
2.守护式方式创建容器
docker run -di --name=容器名称 镜像名称:标签 # 例如 docker run -di --name=jiangnan2 mysql
登录守护式容器方式:
docker exec -it 容器名称(或者容器ID)/bin/bash
停止容器
docker stop 容器名称(或者容器ID)
启动容器
docker start 容器名称(或者容器ID)
如果我们需要将文件拷贝到容器可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
# 例如,将文件拷贝到容器名称jiangnan的容器的/usr/local目录下
docker cp docker-18.06.3-ce.tgz jiangnan:/usr/local
# 执行命令没有报错就说明已经拷好了
# 1.进入容器 2.查看文件是否存在
docker exec -it jiangnan /bin/bash
cd /usr/local
dir
也可以将文件从容器里面拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
# 例如,将容器名为jiangnan的容器中的文件拷贝到当前目录
docker cp jiangnan:/usr/local/docker-18.06.3-ce.tgz docker2-18.06.3-ce.tgz
# dir查看是否拷贝成功
dir
我们可以在创建容器的时候,将宿主机的目录与容器的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加
-v
参数后边为 宿主机目录:容器目录,例如:# 创建容器的时候添加 -v 参数,将容器的目录与宿主机的目录进行映射 # 在宿主机中对目录中的文件进行操作时会直接的映射到容器中对应的映射目录,相反在容器中操作也是如此 docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=jiangnan mysql # 在宿主机的映射目录/usr/local目录下创建一个my.html文件,看是否能影响到容器中对应的映射目录 # 进入目录(宿主机) cd /usr/local # 创建文件 touch my.html # 启动并进入容器查看 docker exec -it jiangnan /bin/bash
如果你共享的是多级的目录,可能会出现权限不足的提示;这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privleged=true 来解决挂载的目录没有权限的问题
我们可以通过以下命令来查看容器运行的各种数据
docker inspect 容器名称(或者容器ID)
也可以直接执行下面命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(或者容器ID)
删除指定容器
注意:如果容器正在被使用是无法删除的,需要先将容器停止
docker rm 容器名称(容器ID)
1.拉取mysql镜像
docker pull centos/mysql-57-centos7
2.创建容器
docker run -di --name=mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
-p
代表端口映射,格式为 宿主机映射端口:容器运行端口这样我们可以通过操作宿主机的
33306
端口从而指向容器中的3306
端口
-e
代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登录密码
3.进入mysql容器
docker exec -it mysql /bin/bash
4.登录mysql
mysql -uroot -p
5.登录远程mysql
使用可视化工具连接mysql
1.拉取镜像
docker pull tomcat:7-jre7
创建容器
创建容器
-p
表示地址映射
docker run -di --name=tomcat -p 9090:8080 -v /Users/jiangnan/docker/tomcat:/usr/local/tomcat/webapps tomcat:7-jar7
访问
服务器IP:9000
此时没有出现tomcat的欢迎页面,我们需要在容器的挂载目录中部署一个项目
1.上传一个 cas.war到容器在宿主机中的映射目录
2.再次访问服务器IP:9090/cas OK!
3.如何显示无法连接,或者连接失败请检查服务器上对应的端口是否有开启
1.拉取镜像
docker pull nginx
2.创建Nginx容器
docker run -di --name=jn_nginx -p 80:80 nginx
3.访问服务器IP:80端口查看nginx是否启动成功,如果启动成功会看到经典的nginx欢迎页面
如何将静态页面部署到nginx服务器上
1.我这里是先向我的服务器的dockerImagesSpace文件夹中上传了一个文件,文件名为dist;文件中是一些html静态页面
2.进入我创建的nginx容器
docker exec -it jn_nginx /bin/bash
3.查看容器的根目录
cd /
4.找到nginx被安装的位置,默认是被安装的了
etc
目录下# 进入 etc 文件夹 cd etc # 查看文件夹中的所有文件 dir # 此时可以看到有一个nginx的目录,进入nginx目录 cd nginx # 查看文件夹中的所有文件 dir # 可以看到有一个nginx.conf文件,预览文件 cat nginx.conf # 输入上面这行命令后他会在终端中打印出文件中的内容,可以看到有一个 include /etc/nginx/conf.d/*.conf; 这个配置的意思是导入的配置文件的路径,进入这个文件中 cd /etc/nginx/conf.d # 查看文件夹中的所有文件 dir # 可以看到有一个default.conf文件,预览文件 cat default.conf # 根据打印在控制台中的内容可以看到有一段配置是 # location / { # root /usr/share/nginx/html; # index index.html index.htm; # } # 这段的配置就是静态资源映射的路径以及默认将会被打开的页面是index.html页面,现在我们要做的事就是将我们向要部署的静态资源copy到对于的目录下 /usr/share/nginx/html # 退出容器 exit # 我这里的静态资源是在我宿主机的 /dockerImagesSpare/nginx 目录下,进入目录 cd /dockerImagesSpare/nginx # 查看文件夹中的所有文件 ls # 我这里是有一个dist文件夹,将文件夹改名为html mv dist html # 将宿主机上的文件拷贝到/usr/share/nginx目录,他会将原来的html文件夹替换 docker cp html jn_nginx:/usr/share/nginx/ # 再次访问浏览器,OK看到的就是你刚刚部署上去的静态页面
1.拉取镜像
dokcer pull redis
2.创建容器
docker run -di --name=jn_redis -p 6379:6379 redis
3.连接redis
如果你本地或者宿主机上有redis的话,我们可以通过redis中的
redis-cli
客户端来远程连接docker伤的redis容器# 首先要进入到redis-cli文件所在的文件夹才能执行下面这行命令 redis-cli -h 服务器/宿主机的IP地址
如果连接不上,请先检查服务器上的6379端口是否打开
可以通过以下命令将容器保存为镜像
# 命令
docker commit 容器名称 镜像名称
# 例如 我将容器名为jn_nginx的容器保存为镜像
docker commit jn_nginx mynginx
# 查看所有镜像,可以看到刚刚的jn_nginx容器已经被保存为mynginx镜像
docker images
可以通过以下命令将镜像保持为tar文件
# 命令
docker save -o 文件名称.tar 镜像名称
# 例如 我将mynginx镜像保存为.tar文件
docker sace -o mynginx.tar mynginx
首先删除已存在在镜像,然后在执行以下命令进行恢复
# 命令
docker load -i 备份的镜像文件名.tar
# 例如 我要恢复mynginx镜像
# 查看所有镜像
docker images
# 首先,我要将我已有的mynginx镜像删调
docker rmi mynginx
# 恢复mynginx镜像
docker load -i mynginx.tar
# 查看所有镜像,会发现刚刚被删掉的镜像已经被恢复了 OK
docker images
-i
输入的文件
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
基础镜像:所有的基础可以分为两种centos,unbent,就是说基础镜像就是操作系统级别的镜像
新的镜像:如果说我们想要构建一个新的镜像,它肯定是先要带一个操作系统的像contos或者ubuntu,比方我在这个系统上装了一个jdk,那么jdk就是在基于contos或者ubuntu上构建的新的镜像,再比方我在这个基础上又装了一个微服务,那么可以说jdk就是这个微服务的基础镜像
Dockerfile存在的意义就是更方便的去构建镜像
1.对于开发人员:可以为团队提供一个完全一致的开发环境;
2.对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
3.对于运维人员:在部署时,可以实现应用的无缝移植
命令 | 作用 |
---|---|
FROM image_name:tar | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量(可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source dir/file | 和ADD相似,但是如果没有解压文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
例子:构建jdk1.8
步骤
1.创建目录
mkdir -p /usr/local/dokcerjdk8
2.下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
3.进入到/usr/local/dokcerjdk8目录,构建文件Dockerfile
注意:构建的文件的名称必须叫Dockerfile,这是固定的
vi Dockerfile
在执行完上面的命令后会到一个编辑页面,我们在编辑页面依次的输入一些命令
# 指定基础镜像,我这里是ContOS7,这个镜像它是必须存在的,如果不存在它首先会去下载这个镜像 FROM centos:7 # 指定镜像的创建者的信息 MAINTAINER 创建者名称 MAINTAINER jn # 设置当前目录 WORKDIR /usr # 创建目录 RUN mkdir /usr/local/java # 添加压缩包并自动解压 ADD 刚才上传的文件 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java # 设置环境变量 配置jdk的环境变量 ENV JAVA_HOMR=/usr/lcoal/java/jdk1.8.0_171 ENV JRE_HOMR $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
4.执行命令构建镜像
docker build -t='jdk.18' .
构建过程一共九步,执行完后查看所有镜像看是否构建镜像成功
docker images
什么是私有仓库:首先它也是用来存放镜像的,一般存放我们自己开发的应用。
作用:为了能在局域网共享一些镜像。为什么是局域网?你懂的!
Docker公有仓库(中央仓库)用来存放一些公用的镜像
1.拉取私有仓库镜像
docker pull registry
2.创建私有仓库容器
# 命令
docker run -di --name=容器名称 -p 5000:5000 registry
# 例如我这里创建一个私有仓库容器
docker run -di --name=jn_registry -p 5000:5000 registry
3.打开浏览器输入服务器IP:5000/v2/_catalog
可以看到
{"repositories":[]}
表示私有仓库搭建成功并且内容为空
4.修改daemon.json文件
vi /etc/docker/daemon.json
添加一下内容,保存并退出
{"insecure-registries":["宿主机IP地址:5000"]}
此步的作用是让docker信任私有仓库地址
5.重启docker服务
systemctl restart docker
1.标记此镜像为私有仓库的镜像
# jdk1.8对应的是上面新的镜像
docker tag jdk1.8 服务器IP地址:5000/jdk1.8
2.再次启动私服容器
docker start registry
3.上传标记的镜像
docker push 服务器IP地址(宿主机):5000/jdk1.8