Docker简介
Docker是一个开发、运输和运行应用程序的开放平台。Docker可以将应用程序和软件应用环境分离,以便快速的交付软件。使用Docker,可以像管理软件那样管理运行环境,并能够利用Docker提供的功能来快速的发布、测试及部署代码,减少开发环境和部署环境配置不一致的问题。
简而言之:Docker是一种可以在同样硬件上实现不同环境的软件,解决了“这段代码在我的机器上没问题呀”的甩锅问题。
Docker引擎
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
其中包括以下组件:
1.服务器:一个长时间运行的程序,称为守护程序进程。
2.REST API:指定客户端程序和服务端程序进行交互的接口。
3.CLI:命令行界面客户端。
![](http://img.wyhcsl.cn//oneblog/20191211102225428.png)
CLI使用Docker REST API通过脚本或者CLI命令控制Docker守护程序或者与Docker守护程序进行交互。
Docker 架构
前面说过Docker是一个CS架构的应用程序。Docker客户端和Docker服务端进行通信,后者负责构建、运行和分发Docker容器。
Docker的客户端和服务端可以在同一台机器上运行,也可以将Docker客户端连接到远程Docker服务端。
Docker客户端和服务端通过REST API进行通信。
Docker 容器通过 Docker 镜像来创建。
Docker服务端
Docker服务端(Docker守护进程)是用于接收Docker API请求并管理Docker对象,如镜像(images)、容器(containner)、网络(network)和数据卷(volumes)等。
Docker应用程序还可以与其他守护程序通信以管理Docker服务。
Docker客户端
Docker客户端是用户与Docker进行直接交互的地方,当使用如Docker run这些命令的时候,客户端会将这些命令发送到服务端进行执行。Docker客户端可以与多个守护进程进行通信。
Docker 内部
要理解 Docker 内部构建,需要理解以下三种部件:
- Docker 镜像 - Docker images
- Docker 仓库 - Docker registeries
- Docker 容器 - Docker containers
Docker 镜像
Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 仓库
仓库可看着一个代码控制中心,用来保存镜像。
Docker 容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
Docker基于CentOS安装
安装方式使用yum安装Docker Engine-Community(社区版)
卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
必要系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看所有仓库中所有Docker版本
yum list docker-ce --showduplicates | sort -r
安装Docker
sudo yum -y install docker-ce
启动Docker
sudo service docker start
加入开机启动
sudo systemctl enable docker
验证安装是否成功
docker version
有client和service两部分表示docker安装启动都成功了
配置阿里云镜像加速器
- 注册属于自己的阿里云账户
- 获得加速器地址链接(https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)
- 登录阿里云开发者平台
- 获取加速器地址
- 配置本机Docker运行镜像加速器
- 输入创建配置文件 vim /etc/docker/daemon.json
- 把对应的加速器地址复制
- 重启
- sudo systemctl daemon-reload
- sudo systemctl restart docker
- service docker restart
输入验证是否配置成功
docker info
可以观察最下面是否有这个Registry Mirrors: 你刚才配置的阿里云镜像加速地址,有就配置成功。
运行Docker 的测试
sudo docker run hello-world
Docker镜像操作
查看镜像
docker images
-
REPOSITORY:镜像所在的仓库名称
-
TAG:镜像标签
-
IMAGE ID:镜像ID
-
CREATED:镜像的创建日期(不是获取该镜像的日期)
-
SIZE:镜像大小
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
搜索镜像
docker search 镜像名称
拉取镜像
docker pull 镜像名称
删除镜像
- 删除指定镜像
docker rmi $IMAGE_ID
- 删除所有镜像
docker rmi `docker images -q`
定制镜像Dockerfile
镜像是容器的基础,每次执行 docker run
的时候都会指定哪个镜像作为容器运行的基础。我们大部分所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Docker容器操作
查看容器
- 查看正在运行的容器
docker ps
- 查看所有的容器(启动过的历史容器)
docker ps -a
- 查看最后一次运行的容器
docker ps -l
- 查看停止的容器
docker ps -f status=exited
创建与启动容器
- 创建容器命令
- docker run
- 参数说明
- -i:表示运行容器
- -t:表示容器启动后会进入容器命令行(交互式)。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
- –name :为创建的容器命名。
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
- -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
交互式容器
交互式容器类似于另开窗口,比如windows下启动redis-server.exe会弹出一个黑框窗口,当我关闭这个黑框的时候,服务也就停止了。
-
创建一个交互式容器
docker run -it --name=mycentos centos /bin/bash (进入容器)
-
停止刚创建的容器
docker stop mycentos
-
启动容器
docker start mycentos
守护式容器
如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器(容器名称不能重复)
-
创建守护式容器
docker run -di --name=mycentos2 centos
-
登录守护式容器
docker exec -it mycentos2 /bin/bash
-
exit退出时,容器不会停止
文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。需在启动的时候指定挂载目录。
创建容器 添加-v参数 后边为 宿主机目录:容器目录,如下:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos
查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect mycentos2
也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2
删除容器
- 删除指定的停止的容器
docker rm $CONTAINER_ID/NAME
- 删除未停止的容器
docker rm -f $CONTAINER_ID/NAME
- 删除所有容器
docker rm `docker ps -a -q`
进入容器
docker exec -it $CONTAINER_ID/NAME bath (/bin/bash)
Docker常用安装
注:以下安装的应用都没有挂载目录,如需挂载须在启动的时候挂载目录
安装tomcat
-
docker hub上面查找tomcat镜像
docker search tomcat
-
从docker hub上拉取tomcat镜像到本地(https://hub.docker.com/_/tomcat?tab=tags)
docker pull tomcat
-
查看是否拉取到tomcat
docker images
-
使用tomcat镜像创建容器(运行镜像)
docker run -di --name mytomcat -p 8080:8080 tomcat
-
通过浏览器访问
安装Mysql
-
docker hub上面查找mysql镜像
docker search mysql
-
从docker hub上拉取mysql镜像到本地(https://hub.docker.com/_/mysql?tab=tags)
docker pull mysql
-
查看是否拉取到mysql
docker images
-
使用mysql镜像创建容器(运行镜像)
docker run -di --name mysql3 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密
-
-
进入mysql容器
docker exec -it mysql bash
-
访问mysql
mysql -uroot -p
-
遇到的问题
我在执行上面步骤的时候出现了mysql闪退的情况,启动不到10秒就自动关闭了,查了很多资料也没发现是什么原因,打印日志如下:
-
解决方案
docker start mysql
-
重启之后进入容器中输入密码提示密码错误
我们之前创建容器的时候就设置了密码为123456,为什么输入时却报错呢?当我查了很多仍一无所获时,无力的在哪里点击enter键,结果突然进去了 ,没错,就是没输入密码。
这里就不做原因说明了,因为我也不清楚,但是可以看看这篇文章来解决
docker部署mysql 时root 用户无法登录问题和解决办法
-
远程连接Navicat
- 对远程连接进行授权
GRANT ALL ON *.* TO 'root'@'%';
- 更改密码的加密规则
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
- 更改root的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
- 刷新权限
flush privileges;
-
连接Navicat
You are not allowed to create a user with GRANT 解决方案
安装Nginx
-
拉取Nginx镜像
docker pull nginx
-
创建Nginx容器
docker run -di --name mynginx -p 8888:80 nginx
-
进入容器
docker exec -it mynginx bash
-
启动
/usr/sbin/nginx (回车)
安装Redis
-
拉取Redis镜像
docker pull redis
-
创建Redis容器
docker run -di --name myredis -p 63379:6379 redis
-
Windows客户端测试
redis-cli -h 39.108.154.245
参考
https://www.funtl.com/zh/docs-docker/