Docker并不是容器,Docker是一个开源的管理容器的引擎,Docker是对软件和其依赖环境的标准化打包,应用之间隔离,共享一个OS Kernel(解决了浪费资源的问题),可以运行在很多的主流系统上,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
我们通过客户端写命令,然后客户端将命令发送给守护进程,守护进程再将命令执行的结果返回给客户端,这就使我们能通过命令查看执行结果,镜像就是容器的源代码,容器通过镜像启动,使用仓库来保存用户构建的镜像,仓库分为共有和私有。
Docker的版本
Docker从2013年3月20日发布 Docker0.1,到现在已经发布了多个版本,从2017年3月开始 docker在原来的基础上分为两个分
支版本: Docker CE和 Docker EE。
Docker CE即社区免费版,可永久免费使用。
Docker EE即企业版,功能更全,更强调安全,但需付费使用。
Docker官方网站:http://www.docker.com
服务器采用的阿里云CentOS Linux release 7.3.1611 (Core) ,Docker version 18.09.6, build 481bc7715
前置条件:
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
使用 yum 安装(CentOS 7下)
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
安装 Docker CE
安装前可以看一下服务器是否安装了Docker:
yum list installed | grep docker
如果安装了,卸载旧版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-enginegine
安装一些必要的系统工具:
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
添加软件源信息:
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-CE:
sudo yum -y install docker-ce
安装完成后使用docker --version(docker version ,docker -v)查看docker是否安装成功。
查看已经安装的docker:
安装Docker CE步骤查看:https://docs.docker.com/install/linux/docker-ce/centos/
卸载:
yum remove containerd.io.x86_64 -y
yum remove docker-ce.x86_64 -y
yum remove docker-ce-cli.x86_64 -y
启动:systemctl start docker 或者 service docker start
停止:systemctl stop docker 或者 service docker stop
重启:systemctl restart docker 或者 service docker restart
检查docker进程的运行状态:systemctl status docker 或者 service docker status
查看docker进程:ps -ef|grep docker
Docker的服务信息:
docker info #查看docker系统信息
docker #查看所有的帮助信息
docker commond --help #查看某个command命令的帮助信息
1、Docker的运行机制
我们知道 Docker并不是容器,而只是一个管理容器的引擎。
Docker的底层运行原理:
Docker服务启动→下载镜像→启动该镜像得到一个容器→容器里运行着我们的程序。
根据Docker的运行机制,我们将按照如下步骤运行第一个Docker容器。
1、将 Docker服务启动。
2、下载一个镜像, Docker运行一个容器前需要本地存在有对应的镜像,如果镜像不存在本地, Docker会从镜像仓库下载(默认是 DockerHub公共注册服务器中的仓库https://hub.dockercom)。
Centos下怎么下载(pull)镜像?
从 docker hυb官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,比如 docker search tomcat进行搜索,然后下载所需要的镜像:下载镜像: docker pull tomcat
Tip:这个时候会提示你拉取tomcat镜像失败,可以配置镜像加速地址,查看:Centos7 Docker下载镜像超时
运行镜像: docker run tomcat 前台运行,要后台运行,加参数-d
基本格式:docker run -tid -p 端口映射 -v 目录或者文件映射 --name 容器名 镜像名:镜像版本号
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-i: 以交互模式运行容器,通常与 -t 同时使用
-d: 后台运行容器,并返回容器ID
-p 端口映射:-p hostport:containerport
-v 目录或者文件映射: -v /hostportfilePath:/containerfilePath
-name 容器名:--name containername
镜像名:镜像版本号:doudouxiuse_jdk1.8.0_121:latest
显示本地已有的镜像: docker images
在列出信息中,可以看到几个字段信息
REPOSITORY:来自于哪个仓库
TAG:镜像的标记,比如 latest
IMAGE ID:镜像的ID号(唯一)
CREATED:创建时间
SIZE:镜像大小
3、启动下载下来的镜像得到一个容器
docker run -d tomcat 或者 docker run -d 894b39cf2fa1
默认是前台启动,如果需要后台启动,指定-d参数。
通过ps -ef |grep tomcat查看,检查 tomcat镜像是否启动容器成功。
4、进入 Docker容器
进入容器: docker exec -it ec159807a80d(容器id) bash
其中i表示交互式的,也就是保持标准输入流打开,t表示虚拟控制台,分配到一个虚拟控制台。
退出容器:exit
5、客户机访问容器
从客户机上访问容器,需要有端口映射,dσcker容器默认采用桥接模式与宿主机通信,需要将宿主机的ip端口映射到容器的ip端口上。
停止容器:docker stop 容器id/名称
启动容器:docker run -d -p 8080:8080(hostport:containerport) tomcat 或者容器id
1、Docker架构
Docker使用客户端-服务器(C/S),使用API来管理和创建Docker容器。
Docker容器通过Docker镜像创建。
2、Docker核心要素
Docker包括三个核心要素
镜像(image)、容器( Container)、仓库( Repository)
1.镜像
1-1、镜像的基本概念
Docker镜像就是个只读的模板,可以用来创建 Docker容器。
例如:一个镜像可以包含一个完整的 centos操作系统环境,里面仅安装了mysq或用户需要的其它应用程序。
Docker提供了—个非常简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
1-2、镜像的组成结构
镜像是由许多层的文件系统叠加构成的,最下面是一个引导文件系统boots,第二层是一个root文件系统 rootfs,root文件系统通常是某种操作系统,比如 centos、 Ubuntu,在root文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成docker中的镜像。
1-3、镜像的日常操作
1、下载镜像,比如下载 redis镜像: docker pull redis:latest,reids是査询到的镜像名称, latest是镜像的标签tag,获取一个镜像有两种方式,一种是从官方镜像仓库下载,一种是自己通过 Dockerfile文件构建,如果果有官方镜像,我们就不必自己用 Dockerfile文件构建了,除非官方没有才会自己去 Dockerfile文件构建。
2、列出已经下载的镜像: docker images,或者 docker images redis
3、运行镜像: docker run -d redis其中d表示在后台运行,然后通过psef| grep redis可以查到reds进程。
4、查看容器镜像的状态: docker ps
通过 docker exec -it eb167506a40a(容器ID) bash进入 redis容器。
5、删除镜像: docker rmi redis:latest #注意是rm,不是rm,rm是删除镜像。
2.容器
2-1、容器的基本概念
容器是从镜像创建的运行实例。它可以被启动、停止、删除。每个容器都是相互隔离的、保证安全平台。可以把看做一个简易版的 Linux环境,包括root用户权限、进程空间、用户空间和网络空间和运行在其中的应用程序。
Docker利用容器来运行应用,镜像是只读的,容器在启动的时候创键一层可写层作为上层。
2-2、容器的日常操作
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动。
通过镜像启动容器: docker run -d redis
查看运行中的容器: docker ps
查看所有的容器: docker ps-a
停止容器: docker stop容器id或容器名称
已经停止的容器,我们可以使用命令 docker start来启动
开启容器: docker start容器i或容器名称
因为 Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创键的。
删除容器: docker rm容器id或容器名称
删除容器时,容器必须是停止状态,否则会报错
进入容器: docker exec -it 容器id或容器名称 bash
查看容器的更多信息:docker inspect+容器id或容器名称
停用全部运行中的容器: docker stop $(docker ps -q)
删除全部容器(未停止的删除不了): docker rm $(docker ps -aq)
一条命令实现停用并删除容器:docker stop $(docker ps -q) & docker rm -f $(docker ps -aq)
3.仓库
3-1、仓库的基本概念
仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务器( Registry)看做同一事物,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库( Public)和私有仓库( Private)两种形式:
最大的公开仓库是Dockerhub(https:/hub.docker.com),存放了数量庞大的镜像供用户下载,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来即可。
注: Docker仓库的概念跟Git类似,注册服务器也类似于GitHub这样的托管服务。
3-2、仓库的日常操作
用户可通过 docker search命令来查找官方仓库中的镜像:docker search rabbitmq
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建。
官方的镜像说明是官方项目组创建和维护的, AUTOMATED资源允许用户验证镜像的来源和内容。
根据是否是官方提供,可将镜像资源分为两类:
一种是类似rabbitmq这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
还有一种类型,比如 bitnami/ centos镜像,它是由 Docker的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 user_name/来指定使用某个用户提供的镜像,比如 bitnami用户。
并利用 docker pull命令来将它下载到本地:
docker pull centos
docker pull rabbitmq
1、Docker安装MySQL
下载MySQL镜像:docker pull mysql:latest(安装的是MySQL8.0)
创建容器:docker run -p 3306:3306 -e MYSQL_DATABASE=workdb -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
其中-e是指定环境变量
进入容器:docker exec -it 2ca13a627d48 bash
登录MySQL:mysql -u root -p
修改密码:ALTER USER 'root'@‘localhost’ IDENTIFIED BY '123456'
授权远程登录访问:
CREATE USER 'panghu'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'panghu'@'%';
我就不使用客户端去连接了,有代理,很蛋疼。如下图
2、Docker安装Nginx
下载Ngixn镜像:docker pull nginx
创键容器:docker run -d -p 80:80 nginx
进入容器:docker exec -it 16d6a44aa822 bash
浏览器访问:http://47.112.11.147/
部署静态网站:将linux的文件拷贝到docker容器某个目录下:docker cp /root/index.html 16d6a44aa822:/usr/share/nginx/html
这里仅仅演示这两个。。。。
1、Dockerfile文件介绍:
Dockerfile用于构建 Docker镜像, Dockerfile文件是由一行行命令语句组成,基于这些命令即可以构建一个镜像,比如下面就是一个
Dockefile文件样例:
FROM XXX/jdk:8
MAINTAINER docker user
ENV JAVA_HOME /usr/local/java
ADD apache-tomcat-8.0.32.tar.gz /usr/local
RUN mv apache -tomcat-8.0.32 tomcat8
EXPOSE 8080
RUN chmod u+x /usr/local/tomcat/bin/*. sh
CMD /usr/local/tomcat/bin/catalina.sh start
2、Dockerfile的基本结构
一般的, Dockerfile分为四部分
基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。
3、Dockerfile指令
FROM
格式为FROM
Dockerfile文件的第一条指令必须为FROM指令。并且,如果在同一个 Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)
MAINTAINER
格式为 MAINTAINER
ENV
格式为EN
ADD
格式为ADD
复制指定的
EXPOSE
格式为 EXPOSE
告诉 Docker服务端容器暴露的端口号,供互联系统使用,在启动容器时需要通过-p映射端口, Docker主机会自动分配一个端口转发到指定的端口。
RUN
格式为RUN
RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用\来换行。
CMD
指定启动容器时执行的命令,每个 Dockerfile只能有一条CMD命令,如果指定了多条命令,只有最后一条会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的
4、自定义镜像
4-1、自定义JDK镜像
FROM centos:latest
MAINTAINER doudouxiuse
ADD jdk-8u121-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
ENV PATH $JAVA_HOME/bin:$PATH
CMD java -version
构建镜像:
docker build -t doudouxiuse_jdk1.8.0_121 -f /home/soft/doudouxiuse_jdk1.8.0_121 . (最后还有一个逗号呢!!!)
-t镜像的名字及tag,通常name:tag或者name格,可以在一次构建中为一个镜像设置多个tag
-f指定Dockerfile文件所在的位置
如果你的Dockerfile文件名为Dockerfile,可以不指定-f,如果为其他文件名,则需要用-f指定。
显示构建成功!!!
运行镜像: docker run 5b8f1be07eca
显示jdk版本,jdk自定义镜像构建完成!!!