Docker的学习

参考: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 docker

3.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

Docker的学习
发现是有个镜像写错了,更改即可。

参考: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的学习

Docker的学习

# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

Docker的学习

容器的操作

容器的创建与停止

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

Docker的学习
使用 -it启动tomcat
Docker的学习

查看运行的容器

docker ps 
常用参数:
-a  查看所有容器,包括未在运行的容器
-q 只查看所有容器的标识
-l 显示最近创建的容器
-n 显示最近创建的n个容器

# -f: 根据条件过滤显示的内容
# --format: 指定返回值的模板文件
# --no-trunc: 不截断输出
# -s: 显示总的文件大小

Docker的学习

查看容器日志

docker logs 容器名|容器id
可以查看所有的容器日志,包括未运行的
常用参数:
-f 跟随最新日志打印
-t 加入时间戳
--tail 加数字  打印最后几条日志

进入与退出容器内部

docker exec -it  容器名|容器ID bash

Docker的学习

退出容器:
输入exit 或者Ctrl+P+Q
查看容器内运行的进程:
docker top 容器ID
查看容器内部细节
docker inspect 容器ID

Docker的学习

从容器内复制文件到宿主机

docker copy 容器ID:容器内路径 目的主机路径

删除容器

删除容器前要停止容器

删除指定容器
docker rm 镜像ID
删除全部容器
docker rm $(docker ps -qa)

数据卷

将宿主机的一个目录映射到容器的一个目录中
在宿主机中改变目录中的内容,容器中的内容也会改变。
这样容器就可以进行持久化操作了。
容器间也能共享数据。

  1. 创建数据卷
    docker volume create 数据卷名称
    创建数据卷后默认会放在/var/lib/docker/volumes/数据卷名称/_data
  2. 查看数据卷的详细信息
    docker inspect volume 数据卷名称
  3. 查看全部数据卷
    docker volume ls
  4. 删除数据卷
    docker volume rm 数据卷名称
  5. 应用数据卷
    注意:容器创建后就不能再添加数据卷了,除非某些使用特殊方法
    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镜像的构建文件,是由一系列命令和参数组成的脚本
它有以下规则:

  1. 每条保留字指令都必须为大写字母且后面要跟至少一个参数
  2. 指令从上到下顺序执行
  3. #表示注释
  4. 指令每执行一次都会在 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

  1. 去github搜索Docker-Compose下载linux版本
  2. 将它移动到linux服务器中
  3. 给他一个可执行权限 chmod 777 docker-compose
  4. 方便后期操作,配置一个环境变量
    将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

  1. 基于docker-compose.yml启动管理的容器
    docker-compose up -d
  2. 关闭并删除容器
    docker-compose down
  3. 开启 | 关闭 | 重启已经存在的由docker-compose维护的容器
    docker-compose start | stop | restart
  4. 查看由docker-compose管理的容器
    docker-compose ps
  5. 查看日志
    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
  1. 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
    dockr-compose up -d
  2. 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
  3. 重新构建自定义镜像
    docker-compose build
  4. 运行前,重新构建
    docker-compose up -d --build
上一篇:docker-compose 自定义容器ip地址


下一篇:Compose概述