一、概述
1. 简介
Docker是一个开源的应用容器引擎,类似于虚拟机技术,但是不是虚拟机,是一个轻量级的容器技术,但是它却实现了虚拟机里面的资源隔离,它的性能远远高于虚拟机的。
解释:
eg: Windows官网的系统是没有安装常用软件和配置的,这时,我们可以把Windows系统的常用软件以及驱动等安装好,然后打包成一个Windows镜像系统。如果别人需要安装系统时,直接安装这个镜像系统,里面就有常用的软件以及驱动了。docker类似于这种机制,虽然它们完全不是一个东西,但是思路一致。比如,在我们开发和运维的过程中,我们经常需要在linux服务器上安装各种环境mysql、redis、tomcat等,这时可以使用docker将已经安装配置好的软件可以打包成一个镜像,比如mysql已经在第一个linux上面安装并配置好了,可以把它打包成一个镜像。这样,别人如果想要给他的linux服务器里面安装mysql,那只要他的linux服务上安装了docker,他就可以用这个docker将之前打包好的mysql镜像直接放在他的服务器里面,运行镜像就可以了,只要运行起来这个镜像(运行起来的镜像我们称为一个容器),比如mysql镜像一运行起来就有mysql容器,mysql就是在它的mysql容器中运行。打包的redis镜像在别的服务器运行就来,它就是redis容器,它在自己的容器里面运行。每一个容器之间它是沙箱的隔离机制。这样的话,想要在其他的linux服务器安装mysql、redis环境,只需要安装一次打包好镜像,在其他服务器里面运行镜像就可以了,不用在每一个服务器里面都安装。
Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。
运行中的这个镜像称为容器,容器启动是非常快速的。
2. 核心概念
沙箱机制(Sandboxie):沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响。
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上,只要在你的机器上安装了docker程序,
你的机器就称之为docker主机,不管是你的本机,还是在你的远程机器);
docker客户端(Client):连接docker主机进行操作(客户端通过命令行或者其他工具使用docker,类似于mysql的客户端和mysql服务器);
docker仓库(Registry):用来保存各种(使用docker)打包好的软件镜像(docker有公用仓库Docker hub,你也可以自己搭建私人仓库);
docker镜像(Images):软件打包好的镜像,放在docker仓库中(以后要安装软件时,去docker仓库中,将我们要安装的镜像下载到本机,
然后直接用docker的命令运行mysql镜像,之后会产生/启动mysql容器,msyql容器就像我们启动了一个mysql).
应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。
镜像:是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用;
image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。
如想要在我们的机器上安装5个tomcat, 下载到tomcat镜像,将这个镜像运行上5次,每一次都是都会生成一个容器,这样就有
5个tomcat容器,就模拟了5个tomcat,只对容器的启动停止,就是tomcat的启动停止。
二、使用步骤
1. 使用Docker的步骤
(1)安装Docker
(2)去Docker仓库找到这个软件对应的镜像(eg:mysql);
(3)使用Docker运行这个镜像(mysql),这个镜像就会生成一个Docker容器(这个容器就代表当前正在运行的镜像,比如tomcat镜像,一运行生成tomcat容器);
(4)对容器的启动停止就是对软件的启动停止;
配置镜像加速:(国外的太慢)
阿里云镜像加速:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
vim /etc/docker/daemon.json 你可能没有这个文件,但是这并不影响
在文件中加入(阿里云镜像):{ "registry-mirrors": ["https://wjfi17tc.mirror.aliyuncs.com"] }
sudo systemctl daemon-reload
sudo systemctl restart docker 重启docker服务
2. 安装Docker
1)安装linux虚拟机
1)VMWare、VirtualBox(安装);
2)导入虚拟机文件centos7-atguigu.ova;
3)双击启动linux虚拟机;使用 root/ 123456登陆
4)使用客户端连接linux服务器进行命令操作;
5)设置虚拟机网络;
桥接网络===选好网卡====接入网线;
6)设置好网络以后使用命令重启虚拟机的网络
service network restart
7)查看linux的ip地址:
ip addr
8)使用客户端连接linux;
2)在linux虚拟机上安装docker
步骤:
1、检查内核版本,必须是3.10及以上 uname -r 2、安装docker yum install docker 3、输入y确认安装 4、启动docker systemctl start docker //restart 重先启动 docker -v 5、开机启动docker systemctl enable docker 6、停止docker systemctl stop docker
3. Docker常用命令&操作
3.1 镜像操作
操作 命令 说明
检索 docker search 关键字 eg:docker search redis 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。 参考:图1
拉取 docker pull 镜像名:tag :tag是可选的,tag表示标签,多为软件的版本,默认是latest (最新的)
列表 docker images 查看所有本地镜像 ,参考图2
删除 docker rmi image-id 删除指定的本地镜像
3.2 容器操作
软件镜像(QQ安装程序)---->运行镜像---->产生一个容器(正在运行的软件,运行的QQ);
以后如果还有装qq,那么只需要运行镜像就可以了,镜像只需要一个。
步骤:
1、搜索镜像 docker search tomcat 2、拉取/删除 镜像 docker pull tomcat
docker rmi 镜像id //删除指定镜像
docker rmi $(docker images -q) //删除所有镜像 3、根据镜像启动容器
// --name: 自定义容器名 -d: 后台运行 tomcat:latest是要运行的镜像名:版本号
docker run --name mytomcat -d tomcat:latest
// -p:将主机的端口映射到容器的一个端口上
docker rum -d -p 8888:8080 tomcat
3.1 进入正在运行的容器并以命令行交互
docker exec -it 容器ID bashShell // eg: bashShell /bin/bash 在容器中打开新的终端,并且可以启动新的进程
docker attach 容器ID //attach 直接进入容器启动命令的终端,不会启动新的进程(重新进入) 4、查看运行中的容器 docker ps eg: docker ps --format "table {{.ID}} {{.Image}} {{.Names}} " 表示显示指定的字段 可参考附录1
docker ps -a //查询所有容器,包括未运行的 5、启动、停止、删除容器 docker stop 容器的id //停止正在运行中的容器
docker start 容器id //启动容器,也可以是容器的name
docker rm 容器id eg: docker rm -f 4b88132f957e -f是强制删除的意思,在无法正常停止的时候使用
docker rm -f $(docker ps -q) //批量删除运行着的容器 -f是强制删除 -q是container id
6、查看容器内部细节
docker inspect 容器ID
8、退出容器
exit //容器停止并退出
ctrl+P+Q //容器不停止退出
9、docker清理命令
docker kill $(docker ps -a -q) //杀死所有正在运行的容器 -q:只显示容器编号
docker rm $(docker ps -a -q) //批量删除所有已经停止的容器
docker rmi $(docker images -q -f dangling=true) //删除所有未打标签的镜像
10、为了演示简单关闭了linux的防火墙 service firewalld status ; // 查看防火墙状态 service firewalld stop // 关闭防火墙 11、查看容器的日志 docker logs container-name/container-id
12、从容器内拷贝文件到主机上(从宿主机内拷贝文件到容器,则通过数据挂载的方式)
docker cp 容器ID:容器内路径 目的主机路径
docker cp host_path containerID:container_path //从主机复制到容器
更多命令参看 https://docs.docker.com/engine/reference/commandline/docker/ (英文网) docker命令大全
docker pull mysql
错误的启动
[root@localhost ~]# docker run --name mysql01 -d mysql 42f09819908bb72dd99ae19e792e0a5d03c48638421fa64cce5f8ba0f40f5846 mysql退出了 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 42f09819908b mysql "docker-entrypoint.sh" 34 seconds ago Exited (1) 33 seconds ago mysql01 538bde63e500 tomcat "catalina.sh run" About an hour ago Exited (143) About an hour ago compassionate_ goldstine c4f1ac60b3fc tomcat "catalina.sh run" About an hour ago Exited (143) About an hour ago lonely_fermi 81ec743a5271 tomcat "catalina.sh run" About an hour ago Exited (143) About an hour ago sick_ramanujan //错误日志 [root@localhost ~]# docker logs 42f09819908b error: database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD;这个三个参数必须指定一个
正确的启动
[root@localhost ~]# docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
b874c56bec49fb43024b3805ab51e9097da779f2f572c22c695305dedd684c5f
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b874c56bec49 mysql "docker-entrypoint.sh" 4 seconds ago Up 3 seconds 3306/tcp mysql01
做了端口映射
[root@localhost ~]# docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844c0e73863b9434
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad10e4bc5c6a mysql "docker-entrypoint.sh" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql02
mysql以3307端口启动:docker run -p 3307:3306 --name mysq3307 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 [参考]
几个其他的高级操作
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysql docker容器的/etc/mysql/conf.d文件夹里面
改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)
mysql其他常用参数:
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci //指定编码
--lower_case_table_names=1 //表名不区分大小写
--restart=always //开机自动启动
附录:
附录1:
docker ps 默认的显示内容过多,当值过长时就会导致折行,可读性很差,所以希望只显示自己关心的某些列。
可以自己指定显示的模板,例如:
docker ps --format "table {{.ID}} {{.Image}} {{.Names}} "
附图说明:
图片仓参考区:此部分作为上面的补充说明
图1:
docker search mysql:搜索镜像的命令
index:索引名称;
name:这是镜像名字,只有写"docker.io/:后面的部分就可以;
description:镜像的描述;
stars:有多少人关注了这个镜像,单位为k(千人);
official:是不是mysql官方发布的镜像,官方的没有帮我们做一些自动配置,我们可以自定义配置;
automa:是不是自动构建的,如果写了ok,说明这个镜像是自动化的,我们只要一运行,所有的配置都帮我们配置好了;
图2:
docker images:查看本地所有镜像
repository:从哪里下载的镜像
tag:标签
image_id:镜像id
created:这个镜像是被什么时候创建的
size:镜像大小
参考: 沙箱机制