Docker
1 Docker介绍
Docker是当下使用最多的一种容器技术,docker对于专门的运维人员要求较高,开发人员也是要适当的学习下。
Docker中最重要的三个概念:仓库、镜像、容器。
- 镜像(Image),即将jdk+项目jar包等文件以Docker的形式打包在一起就是镜像。类似系统镜像
- 容器(Container),将镜像实例化启动起来,就形成了容器。容器是一个轻量化的Linux系统,root用户权限、进程空间、用户空间和网络空间都有。
- 比如需要部署一个redis,在linux系统中需要下载、安装、配置环境变量,而在docker中只需要将做好的redis镜像下载运行起来称为一个轻量级的linux,就直接拥有了redis环境。(类似win系统镜像中的自带软件)
- 仓库(Repository):仓库用于存放Docker镜像,类似GitHub存放代码的仓库;仓库可以供用户pull
- 通过pull命令获取docker hub上的镜像,如mysql、redis等
- 将拉取的镜像在本地run起来,称为容器
- 如果需要自己构建一个镜像时,要在springboot项目中使用build命令构建
2 Docker安装
参考文章:https://www.cnblogs.com/kingsonfu/p/11576797.html
拥有一台Linux系统,并连接到Linux系统。
2.1 Ubuntu中安装docker
- 切换至root用户下,否则权限不够:
sudo su
- 更新apt-get,保证apt-get最新版本:
apt-get update
- 安装docker:
apr-get install -y docker.io
- 安装完成后查看docker版本:
docker version
- 启动docker服务:
service docker start
(已经运行后再次执行也不会报错) - 再次执行
docker version
可以查看是否启动成功- 如果有Clinet和Service说明启动成功了
2.2 CentOS中安装docker
CentOS7安装docker要求系统为64位,内核版本为3.10以上,查看内核版本:
uname -r
如果存在旧版本docker,则先卸载后重新安装(使用卸载成功)
# 1、查看安装过的docker: yum list installed | grep docker docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos docker-client.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos docker-common.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos # 2、卸载docker:(删除安装包命令:yum remove docker,功能类似) sudo yum remove -y docker-ce.x86_64 docker-client.x86_64 docker-common.x86_64 # 3、删除容器镜像: sudo rm -rf /var/lib/docker # 4、 再次查看安装过的docker,显示不存在 # 5、 重新安装docker sudo yum install docker-ce
使用docker仓库进行安装(虚拟机安装成功)
- 安装依赖包:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 配置镜像源
- 官方地址(慢):
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 阿里云镜像:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 清华大学源:
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 官方地址(慢):
- 安装docker-ce:
sudo yum install docker-ce
- 启动docker服务:
sudo systemctl start docker
开机自启:sudo systemctl enable docker
- 查看docker服务运行状态:
sudo systemctl status docker
- 使用hello-world镜像命令验证docker是否可用:
docker run hello-world
(如果不存在该镜像会自动从远程仓库拉取并运行)
- 安装依赖包:
用yum源安装docker(同上一种安装方式)
- 查看是否存在已安装的docker列表:
yum list installed | grep docker
- 使用yum命令安装docker:
yum -y install docker
(-y表示不询问安装) - 安装完成后再次使用
yum list installed | grep docker
查看安装列表 - 使用命令启动docker服务:
systemctl start docker
- 命令查看docker服务状态:
systemctl status docker
- 如图所示表示docker服务安装并启动成功:
- 查看是否存在已安装的docker列表:
使用官方安装脚本自动安装
- 安装命令为:
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
- 或国内daocloud安装命令:
curl -sSL https://get.daocloud.io/docker | sh
- 安装命令为:
离线安装docker
通过
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz
下载docker或 点击下载 至本地,再使用ftp工具上传服务器。使用命令解压docker包:
tar -zxvf docker-18.06.3-ce.tgz
将解压文件复制到
/usr/bin/
目录下:cp docker/* /usr/bin/
在
/etc/systemd/sysgtem/
下新增docker.service文件,添加如下内容,将docker.service注册为服务[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker #设置域名访问权限 ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1 ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process # restart the docker process if it exits prematurely Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target
修改docker.service文件权限:
chmod +x /etc/system/docker.service
并进行服务的重载systemctl daemon-reload
命令启动docker服务:
systemctl start docker
(可选)设置docker服务为开机自启:
systemctl enable docker.service
查看docker启动状态:
systemctl status docker
3 Docker使用
3.1 第一个Docker镜像
- 使用命令查看docker本地镜像信息:
docker images
- 使用命令从远程仓库拉取指定镜像到本地:
docker pull hello-world
- 使用run命令执行一个镜像:
docker run hello-world
- 配置仓库拉取镜像时的加速器(docker hub是外网,拉取镜像时可能会网络超时,配置阿里云加速器)
- 登录阿里云 ,进行加速器的配置
- 使用命令配置镜像加速器
- 命令行换行输入使用:
\+enter
- <<-EOF之后回车会自动换行,直到最后EOF输入后执行所有语句
- 命令行换行输入使用:
- 重新加载配置:
sudo systemctl daemon-reload
- 重新启动docker服务:
sudo systemctl restart docker
- 查看当前运行的容器信息:
docker ps
,查看所有容器信息:docker ps -a
- docker中镜像运行方式
- 前台运行:
docker run nginx
,显示当前运行状态,无法进行其他操作,使用ctrl+C停止 - 后台运行:
docker run -d nginx
,-d即 –detach ,执行后返回容器id,使用ps查看当前运行的容器
- 前台运行:
- 使用命令结束容器运行:
docker stop id
(id一般使用前两位即可)
3.2 Nginx镜像
- 拉取nginx镜像
- 后台运行nginx并映射主机端口:
docker run -d -p 8080:80 nginx
- 访问主机地址:端口,显示nginx主页:
3.3 容器化MySQL
可以在 阿里云镜像中心 搜索相关的镜像,会跳转到docker官网镜像处。
MySQL镜像使用步骤:
- 使用命令查询mysql镜像信息:
docker search mysql
- 从远程仓库拉取mysql镜像,
docker pull mysql
- 通过docker run 运行镜像
- -d进行后台运行
- -p指定mysql镜像映射的主机端口
- -e后跟mysql的参数,来连接查询数据库的名称和连接密钥
- 如命令:
docker run -d -p 3306:3306 -e MYSQL—_ROOT_PASSWORD=root -e MYSQL_DATABASE=datebase mysql:latest
- 属性名称必须要大写,否则无效
- -e MYSQL_ROOT_PASSWORD=root:设置 MySQL 服务 root 用户的密码为root
-e MYSQL_DATABASE=datebase
,创建一个名为databse的数据库
- 运行成功后,可以进入到mysql镜像中并查看mysql信息
- 使用
docker ps
查看当前执行的镜像的ID, - 使用命令进入到docker镜像中:
docker exec -it 镜像ID bash
,进入后命令行前缀用户就变成了容器ID。 - 进入容器中,就相当于进入了一个轻量级Linux,命令是相同的
- 进入mysql镜像后,使用命令连接mysql:
mysql --user=root --password
或mysql -h localhost -u root -p
然后输入密码登录
- 使用
错误:服务器上通过docker命令运行和访问正常,但是使用navicate远程连接mysql时报错如下:
首先通过mysql镜像的ID进入到镜像中,并连接mysql
mysql -u root -p
输入密码开启远程访问权限
- 查看数据库信息
show databases;
- 切换使用mysql数据库:
use mysql;
- 查询user表权限信息:
select host,user from user
-
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
- 刷新操作:
flush privileges;
- 然后可以远程使用navicate连接了。
- 原因:镜像中root用户已经有了远程连接的权限,但是模式不一样导致无法连接,因此要将root用户的密码改成 mysql_native_password 模式即可。
- 查看数据库信息
问题: 每次运行mysql时使用命令创建数据库,当服务stop之后,数据库就没了,下次运行要重新创建?
- 如果每次都重新run运行mysql镜像,那么每次启动后服务的ID是不同的,就是不同的服务,则数据库是一个原始的数据库
- 而使用命令
docker ps -a
可以查看所有的服务,找到之前服务的ID,直接docker start ID
可以运行已经存在的服务,且配置是一样的。
3.4 Docker安装Redis
4 Docker中网络设置
docker容器是一个小的linux,也就是一个虚拟机。容器想要跟外部进行交互,就只能先通过CentOS服务器主机的网卡,然后再与外界交互。docker容器与外部主机网络通讯的方式有三种:
- 桥接(Bridge),最常用,将主机上的端口映射到docker容器的端口上,如8080:8081既是将主机上的8080端口映射到docker容器的8081端口
- 桥接模式使用
-P
或-p
参数指定端口映射方式,如:-p 主机端口:容器端口
-P
则是使用随机的主机端口来映射docker端口。 - 如命令
docker run -d -p 8080:80 nginx
,即后台执行nginx,使用主机8080端口映射docker中80端口。 docker run -d -P nginx
,即后台执行nginx,并使用主机随机端口来映射nginx对应的80端口- 映射并运行成功后,访问主机地址:主机端口就可以访问docker容器中运行的服务
- 桥接模式使用
- 共享(Host),主机与docker容器共享同一个端口
- 无网络(None),docker容器中没有网络,外界无法访问
5 Docker常用命令
- 重启docker:
systemctl restart docker
- 关闭docker:
systemctl stop docker
5.1 镜像操作
镜像即远程仓库中拉取的系统镜像
- 搜索查询镜像:
docker search mysql
- 下载拉取镜像(最新):
docker pull mysql:latest
- 查看、删除本地镜像
- 查看本地镜像:
docker images
- 删除本地镜像:
docker rmi <image id>
- 删除全部镜像:
docker rmi $(docker images -q)
- 如果镜像因为关联而无法删除,可以使用-f参数强制删除:
docker rmi -f $(docker images -q)
- 查看本地镜像:
5.2 容器操作
容器是将拉取的镜像执行后生成的服务
- 运行指定容器服务:
docker start <容器名/ID>
,如docker run mysql
- 后台运行容器服务:
docker run -d mysql
- 后台运行并端口映射:
docker run -d -p 3306:3306 mysql
- 映射
120.0.0.1:3306:3306
不指定主机端口时映射到随机端口;主机地址默认为0.0.0.0 - 重启指定容器:
docker restart <容器名/ID>
- 后台运行容器服务:
- 查看进程(正在运行的容器):
docker ps
- 查看所有容器,包括已经停止的:
docker ps -a
- 查看所有容器,包括已经停止的:
- 停止、杀死、删除指定容器
- 停止指定容器:
docker stop <容器名/ID>
- 停止所有容器:
docker stop $(docker ps -a -q)
- 停止所有容器:
- 杀死指定容器:
docker kill <容器名/ID>
- 删除容器:
docker rm <容器名/ID>
- 删除所有容器:
docker rm $(docker ps -a -q)
- 删除所有容器:
- 关闭docker中的mysql容器服务:
docker stop mysqlserver/ID
- 重启docker中的mysql服务:
docker restart ID
- 停止指定容器:
- 查看容器日志:
docker logs -f <容器名/ID>
- 查看docker中指定容器的前10条日志信息:
docker logs -f --tail 10 ID
- 查看docker中指定容器的前10条日志信息:
- 进入到docker镜像
sudo docker attach <image id>
,该命令在多端使用时会同步阻塞,不太适合生成环境- 可以安装ssh Server后使用ssh连接进入,但是没有必要
- 安装nsenter后使用命令,使用比较繁琐
- docker 1.3.x之后提供了exec命令进入容器,
sudo docker exec -it <image id> /bin/bash
6 制作Docker镜像
将自己的springboot项目制作成为镜像,需要:
将项目打为jar包
服务器获取项目的jar包(可上传至git上,然后使用get clone来远程获取)
git clone https://gitee.com/chaitou/hello-springboot
- 前提是服务器linux中已经安装了git
进入到项目jar包中,并在同级目录下编写dockerfile文件
cd hello-springboot
vim Dockerfile
# 依赖的基础镜像 from java:8 # 创建者 MAINTAINER bugpool xxx@163.com # 将当前目录下的jar复制到容器/目录下 COPY hello-springboot.jar /hello-springboot.jar # 指定启动时运行java -jar 命令 ENTRYPOINT ["java", "-jar","/hello-springboot.jar"]
拉取java镜像以满足项目运行环境
docker pull java:8
使用 docker build来构建镜像,将springboot构建为本地镜像
docker build -t hello-springboot:1.0 .
- -t指明了镜像名和版本号;点号代表当前目录
启动构建的镜像,并使用-p来映射主机端口
docker run -p 80:8080 hello-springboot:1.0
可以通过主机地址:80端口+项目接口地址/hello来访问