参考:CSDN博主「1024肥宅」
原文链接:https://blog.csdn.net/lqpf199681/article/details/110518692
Docker简介
在没有Docker时,我们开发一个应用之后要在服务器配置各种软件。比如MySQL、Tomcat、Java等等,十分繁琐。
传统上认为,软件编码完成后,还需要提供运行环境列表供运维团队进行部署。
开发需要清楚的告诉运维团队所需的运行环境和全部配置文件,即便如此,仍然常常发生部署失败等问题。
Docker镜像的设计,使得Docker得以打破过去【程序即应用】地观念。
通过镜像(image)将作用系统核心除外,运作应用程式所需要的系统环境,由上而下打包,达到程式跨平台间的无缝接轨运作。
Docker在Linux容器技术的基础上发展过来的,将应用运行在Docker容器上,而Docker容器在任何系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,就可以一键部署,大大简化了操作。
一句话:解决了运行环境和配置
什么是镜像?
镜像里面包含了你的应用运行所需要的各种环境(当然,需要你自己配置,配置好了才有),然后你把你的应用放进去运行就可以了。镜像运行起来就是容器(container)。
安装Docker
1.下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装Docker
#yum makecache fast
yum -y install docker-ce
4.启动Docker,并设置为开机自动启动,测试
1. 启动Docker服务
systemctl start docker
2. 设置开机自动启动
systemctl enable docker
3. 测试
docker run hello-world
Docker的仓库
1.Docker官网的*仓库:这个仓库是镜像最全的,但是下载速度最慢
https://hub.docker.com/
2.国内的镜像网站:网易蜂巢,daoCloud
https://c.163yun.com/hub#/home
需要在/etc/docker/daemon.json中修改(没有的话创建一个)
内容如下:
{
“registry-mirrors”: [
“https://rq5uyt7.mirror.aliyuncs.com”,
“https://docker.mirrors.ustc.edu.cn”,
“https://registry.docker-cn.com”
]
}
重启两个服务
systemctl daemon-reload
systemctl restart docker3.http://hub.daocloud.io(推荐使用)
在公司内部会采用私服的方式拉取镜像(添加配置)
{
"registry-mirrors":["https://registry.docker-cn.com"],"insecure-registries":["ip:port"]
}
# ip:port
公司私服的ip和port
# 重启两个服务
systemctl daemon-reload
systemctl restart docker
Docker启动失败
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
进行排查
无法查看容器
[root@VM-16-9-centos ~]# sudo docker container ls
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
查看docker状态也发现不了什么
[root@VM-16-9-centos ~]# sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: failed (Result: start-limit) since Fri 2021-11-19 11:25:24 CST; 3min 39s ago
Docs: https://docs.docker.com
Process: 18736 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
Main PID: 18736 (code=exited, status=1/FAILURE)
Nov 19 11:25:22 VM-16-9-centos systemd[1]: docker.service failed.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: docker.service holdoff time over, scheduling restart.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: Stopped Docker Application Container Engine.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: start request repeated too quickly for docker.service
Nov 19 11:25:24 VM-16-9-centos systemd[1]: Failed to start Docker Application Container Engine.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: Unit docker.service entered failed state.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: docker.service failed.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: start request repeated too quickly for docker.service
Nov 19 11:25:24 VM-16-9-centos systemd[1]: Failed to start Docker Application Container Engine.
Nov 19 11:25:24 VM-16-9-centos systemd[1]: docker.service failed.
排查
sudo dockerd --debug
发现是有个镜像写错了,更改即可。
参考:https://blog.csdn.net/qxqxqzzz/article/details/109712603
Docker 常用命令
镜像的操作
# 1.拉取镜像到本地
docker pull 镜像名称[:tag]
例如:
docker pull tomcat:8.5.15-jre8
1.1 查询镜像
docker search 某个镜像的名字
docker search xxx --no-trunc 显示完整的镜像描述
# 2.查看本地全部的镜像
docker images
# 3.删除本地镜像
docker rmi 镜像的标识
# 4.镜像的导入导出
# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件目录/镜像文件
ps:即便你改了保存的镜像名字,再加载它还是原来的镜像名
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本
容器的操作
容器的创建与停止
1.创建容器 docker run 镜像的标识|镜像的名称[tag]
常用的参数:
docker -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称:tag
其中 -d 代表后台运行容器
-p 宿主机端口:容器端口 映射宿主机端口与容器端口 如果要使用多个端口就要添加多个-p参数
--name 容器名称 指定容器名称
-it 以交互模式启动一个容器 后面可以跟在容器内执行的命令,这种情况只要你退出了交互就会停止。且没有办法和-d一起使用(一个是后台启动,一个是交互时,不兼容)
例如:
docker run -d -p 8080:8080 -p 3306:3306 --name hstomcat mytomcat:1.0.0
2.启动容器 docker start 容器ID|容器名
重启容器 docker restart 容器ID|容器名
停止容器 docker stop 容器ID|容器名
强制停止容器 docker kill 容器ID|容器名
停止全部容器 docker stop $(docker ps -qa)
3. Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
使用 -it启动tomcat
查看运行的容器
docker ps
常用参数:
-a 查看所有容器,包括未在运行的容器
-q 只查看所有容器的标识
-l 显示最近创建的容器
-n 显示最近创建的n个容器
# -f: 根据条件过滤显示的内容
# --format: 指定返回值的模板文件
# --no-trunc: 不截断输出
# -s: 显示总的文件大小
查看容器日志
docker logs 容器名|容器id
可以查看所有的容器日志,包括未运行的
常用参数:
-f 跟随最新日志打印
-t 加入时间戳
--tail 加数字 打印最后几条日志
进入与退出容器内部
docker exec -it 容器名|容器ID bash
退出容器:
输入exit 或者Ctrl+P+Q
查看容器内运行的进程:
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
从容器内复制文件到宿主机
docker copy 容器ID:容器内路径 目的主机路径
删除容器
删除容器前要停止容器
删除指定容器
docker rm 镜像ID
删除全部容器
docker rm $(docker ps -qa)
数据卷
将宿主机的一个目录映射到容器的一个目录中
在宿主机中改变目录中的内容,容器中的内容也会改变。
这样容器就可以进行持久化操作了。
容器间也能共享数据。
- 创建数据卷
docker volume create 数据卷名称
创建数据卷后默认会放在/var/lib/docker/volumes/数据卷名称/_data - 查看数据卷的详细信息
docker inspect volume 数据卷名称 - 查看全部数据卷
docker volume ls - 删除数据卷
docker volume rm 数据卷名称 - 应用数据卷
注意:容器创建后就不能再添加数据卷了,除非某些使用特殊方法
docker run -v 数据卷名称:容器内部路径 镜像ID
如果数据卷不存在,docker会自动创建数据卷
docker run -v 路径:容器内部路径 镜像ID
直接指定一个路径作为数据卷传输位置,这个路径下是空的
注意:后面跟的是镜像ID|镜像名;并且这样创建的不是数据卷,使用docker volume ls查询不到,但是可以建立关联
docker run -v volumeOfhstomcat:/usr/local/tomcat/webapps -d -p 8080:8080 -p 3306:3306 --name hstomcat mytomcat:1.0.0
Docker File
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数组成的脚本
它有以下规则:
- 每条保留字指令都必须为大写字母且后面要跟至少一个参数
- 指令从上到下顺序执行
- #表示注释
- 指令每执行一次都会在 docker 上新建一层镜像层,并提交。所以过多无意义的层,会造成镜像膨胀过大。
例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
DockerFile保留字指令
- FROM 基础镜像,当前镜像是基于哪个镜像的
- MAINTAINER 镜像维护者的姓名和邮箱
- RUN 容器构建时需要运行的命令
- EXPOSE 当前容器对外暴露的接口
- WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
- ENV 用来在构建镜像过程设置环境变量
- ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 例如:COPY src,dest 或COPY [“src”,“dest”]
- VOLUME 容器数据卷,用于数据保存和持久化工作
- CMD 指定一个容器启动时要运行的命令。只有最后一个CMD命令会生效,CMD会被docker run后面的参数替换
- ENTRYPOINT 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数
- ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承时onbuild被触发
Docker自定义镜像
创建一个文件夹,在文件夹下创建dockerfile,使用命令
docker build -t 镜像名:tag
即可自定义镜像
从容器中创建一个新的镜像
docker commit [OPTIONS] 容器ID 镜像名:tag .
注意:最后面有一个点,这个 . 代表本次执行的上下文路径
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
Docker-Compose
当你有多个镜像需要运行时,比如微服务情况或者数据库未放在容器中。
每个镜像运行都需要添加大量参数,十分繁琐。
可以使用Docker-Compose批量管理这些容器,只需要通过一个Docker-compose.yml文件维护即可。
下载Docker-Compose
- 去github搜索Docker-Compose下载linux版本
- 将它移动到linux服务器中
- 给他一个可执行权限 chmod 777 docker-compose
- 方便后期操作,配置一个环境变量
将docker-compose文件移动到了/usr/local/bin,修改了/etc/profile文件,给/usr/local/bin配置到了PATH中
mv docker-compose /usr/local/bin
vi /etc/profile
export PATH=/usr/local/bin:$PATH
source /etc/profile
Docker-Compose管理tomcat和mysql
version: '3.1'
services:
mysql: # 服务的名称
restart: always # 代表只要Docker启动,那么这个容器就跟着一起启动
image: daocloud.io/library/mysql:5.7.4 # 指定镜像路径
container_name: mysql # 指定容器名称
ports:
- 3306:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 映射数据卷
tomcat:
restart: always # 代表只要Docker启动,那么这个容器就跟着一起启动
image: daocloud.io/library/tomcat:8.5.15-jre8 # 指定镜像路径
container_name: tomcat # 指定容器名称
ports:
- 8080:8080 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps # 映射数据卷
- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs # 映射数据卷
使用docker-compose命令管理容器
在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml
- 基于docker-compose.yml启动管理的容器
docker-compose up -d - 关闭并删除容器
docker-compose down - 开启 | 关闭 | 重启已经存在的由docker-compose维护的容器
docker-compose start | stop | restart - 查看由docker-compose管理的容器
docker-compose ps - 查看日志
docker-compose logs -f
docker-compose配置Dockerfile使用
使用docker-compose.yml文件以及Dockerfile文件在生产自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器
docker-compose.yml
yml文件
version: '3.1'
services:
ssm:
restart: always
build: # 构建自定义镜像
context: ../. # 指定dockerfile文件的所在路径
dockerfile: Dockerfile # 指定Dockerfile文件名称
image: ssm:1.0.1
container_name: ssm
ports:
- 8081:8080
environment:
TZ: Asia/Shanghai
**Dockerfile文件**
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
- 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
dockr-compose up -d - 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
- 重新构建自定义镜像
docker-compose build - 运行前,重新构建
docker-compose up -d --build