Docker容器(3)单容器管理

一、单容器

1.1概念简介

Docker三个重要概念:

  • 仓库(Repository);
  • 镜像(Image);
  • 容器(Container). *Docker的三个重要概念是仓库(Repository)、镜像(Image)和容器(Container)**。具体如下:
  1. **镜像(Image)**:Docker镜像是创建容器的基础,它类似于虚拟机的镜像,是一个只读的模板,包含了操作系统、软件运行环境以及用户应用程序。镜像是用于创建Docker容器的蓝图,通过版本管理和增量文件系统,Docker提供了一套简单的机制来创建和更新现有的镜像。
  2. **容器(Container)**:Docker容器是从镜像创建的应用运行实例。容器可以启动、开始、停止和删除,而且它们之间是相互隔离的,互不影响。容器利用了Linux内核的特性来实现应用的运行和隔离,因此相比传统的虚拟化技术,容器更加轻量级,启动速度快,资源消耗少。可以把容器看作是由镜像这个"类"实例化出的一个独立运行的"对象"。
  3. **仓库(Repository)**:Docker仓库用来集中存放和管理镜像文件,类似于代码仓库。仓库分为公共仓库和私有仓库。公共仓库如Docker Hub提供了大量的官方和第三方镜像供用户下载使用。私有仓库则是企业内部用于存储自己创建的镜像的地方,通常用于提高镜像下载的速度和安全性。

1.2底层原理

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个命令!

1.3Docker基本命令

Docker指令处理单条使⽤外,还⽀持赋值、解析变量、嵌套使⽤.

Docker指令的基本⽤法

docker + 命令关键字(COMMAND) + 参数

  • docker pull <image>:从注册表(如Docker Hub)下载映像。
  • docker build -t <image_name> <path>:从Dockerfile构建映像,其中<path>是包含Dockerfile的目录。
  • docker image ls:列出本地计算机上可用的所有映像。
  • docker run -d -p <host_port>:<container_port> --name <container_name> <image>:从映像运行容器,将主机端口映射到容器端口。
  • docker container ls:列出所有正在运行的容器。
  • docker container stop <container>:停止正在运行的容器。
  • docker container rm <container>:从本地计算机中删除已停止的容器。
  • docker image rm <image>:从本地计算机中删除映像。

-----帮助命令-----

docker version # docker版本信息

docker info # 系统级别的信息,包括镜像和容器的数量

docker 命令 --help

docker info

docker info命令用于获取Docker的系统信息,包括版本、容器数量、存储驱动、网络配置等。

以下是一些常见的输出信息:

  • Containers: 当前运行的容器数量。
  • Images: 当前存在的镜像数量。
  • Storage Driver: 使用的存储驱动名称和版本号。
  • System Time: 系统时间。
  • ID: Docker守护进程的ID。
  • Logging Driver: 日志驱动程序的名称和版本号。
  • Cgroup Driver: Cgroup驱动程序的名称和版本号。
  • Operating System: 操作系统的名称和版本号。
  • Kernel Version: 内核版本号。
  • Architecture: CPU架构(x86_64)。
  • CPUs: CPU核心数。
  • Total Memory: 总内存大小。
  • Name: Docker主机名。
  • Labels: Docker主机标签。

-----镜像命令-----

docker search命令用于在Docker Hub上搜索镜像。

以下是一些常见的输出信息:

  • NAME: 镜像名称。
  • DESCRIPTION: 镜像描述。
  • STARs: 该镜像的收藏数·。
  • IS FOR: 该镜像适用的平台。
  • OFFICIAL: 是否为官方镜像。
  • AUTOMATION: 是否支持自动化构建。
  • LAST UPDATED: 最后更新时间。

docker images

docker images命令用于列出本地主机上的所有Docker镜像。

以下是一些常见的输出信息:

  • REPOSITORY: 镜像仓库名称。
  • TAG: 镜像标签。
  • IMAGE ID: 镜像ID。
  • CREATED: 创建时间。
  • SIZE: 镜像大小。

docker rmi

`docker rmi`命令用于删除本地的一个或多个Docker镜像。

以下是一些常见的用法示例:

  1. 删除单个镜像:
bash 复制代码
docker rmi myimage:latest
  1. 同时删除多个镜像:
bash 复制代码
docker rmi myimage:latest myrepo/myotherimage:v1.0
  1. 强制删除镜像(包括正在运行的容器所使用的镜像):
bash 复制代码
docker rmi -f myimage:latest
  1. 删除所有未使用的镜像:
bash 复制代码
docker image prune -a

在执行`docker rmi`命令时,需要注意以下几点:

  • 如果指定的镜像正在被容器使用或存在依赖关系,则无法直接删除。在这种情况下,可以先停止并删除相关容器,然后再尝试删除镜像。
  • 使用`-f`选项可以强制删除镜像,但这可能会导致数据丢失,因此请谨慎使用。
  • -`docker rmi`命令与`docker rm`命令不同,`docker rm`用于删除容器,而`docker rmi`用于删除镜像。

docker pull

`docker pull`命令用于从Docker Hub或其他Docker镜像仓库下载一个或多个镜像到本地。

以下是一些常见的用法示例:

  1. 下载单个镜像:
bash 复制代码
docker pull nginx
  1. 同时下载多个镜像:
bash 复制代码
docker pull nginx redis
  1. 指定版本号下载镜像:
bash 复制代码
docker pull nginx:1.19.0
  1. 使用标签(tag)下载镜像:
bash 复制代码
docker pull nginx:alpine
  1. 从私有仓库下载镜像:
bash 复制代码
docker pull myregistry.com/myrepo/myimage:latest
  1. 在下载过程中显示进度信息:
bash 复制代码
docker pull --progress nginx
  1. 指定下载时的代理服务器:
bash 复制代码
docker pull --proxy=http://myproxy.com:8080 nginx

-----容器命令-----

docker ps

docker ps命令用于列出当前运行的Docker容器。

以下是一些常见的输出信息:

  • CONTAINER ID: 容器ID。
  • IMAGE: 镜像名称和标签。
  • COMMAND: 启动容器时执行的命令。
  • CREATED: 容器创建时间。
  • STATUS: 容器状态,如"Up"表示正在运行,"Exited"表示已停止。
  • PORTS: 容器暴露的端口号和绑定的主机端口号。
  • NAMES: 容器名称。

docker ps ---no-trunc

`docker ps --no-trunc`命令用于列出所有正在运行的Docker容器,并显示完整的容器信息。

docker run

`docker run`命令用于从Docker镜像创建并启动一个新的容器。

以下是一些常见的用法示例:

  1. 运行一个基于Ubuntu的容器,并在其中执行bash shell:
bash 复制代码
docker run -it ubuntu bash
  1. 运行一个基于Nginx的容器,并将主机的80端口映射到容器的80端口:
bash 复制代码
docker run -d -p 80:80 --name mynginx nginx
  1. 运行一个基于Python的容器,并将当前目录挂载到容器的/app目录:
bash 复制代码
docker run -v $(pwd):/app python myscript.py
  1. 运行一个基于Node.js的容器,并将容器的8080端口映射到主机的8080端口:
bash 复制代码
docker run -d -p 8080:8080 --name mynodejs node myapp.js

在执行`docker run`命令时,需要注意以下几点:

  • `-d`选项表示以后台模式运行容器。

  • `-p`选项用于将主机的端口映射到容器的端口。

  • `--name`选项用于指定容器的名称。

  • `-v`选项用于将主机的目录或文件挂载到容器中。

  • `CMD`和`ENTRYPOINT`指令用于指定容器启动时要执行的命令。

docker run运行原理

docker start/stop

docker start 容器id # 启动容器

docker restart 容器id # 重启容器

docker stop 容器id # 停止当前正在运行的容器

docker kill 容器id # 强制停止当前的容器

退出容器

exit # 直接退出容器并关闭
Ctrl + P + Q # 容器不关闭退出

后台启动容器

命令 docker run -d 镜像名

[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker run -d centos

问题 docker ps, 发现centos停止了

常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止

nginx, 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了

总结

每个容器被创建之后,都会分配⼀个ContainerID作为容器的唯⼀标识,后续对容器的启动、停⽌、修改、删除等操作,都可以通过这个ID来完成.

1.4常见单容器命令

查看日志

docker logs -tf --tail number 容器id

查看容器中进程信息ps

# 命令 docker top 容器id

具体来说:

  • UID: 用户ID,表示启动该进程的用户。
  • PID: 进程ID,是操作系统中唯一标识一个进程的数字。
  • PPID: 父进程ID,即创建当前进程的进程的ID。
  • C: CPU使用率,显示了进程自创建以来占用CPU的时间。
  • STIME: 进程开始时的系统时间。
  • TTY: 终端类型,? 表示没有关联到特定的终端设备。
  • TIME: 进程消耗的CPU时间总和。
  • CMD: 启动进程的命令行。

查看镜像的元数据

docker inspect 容器id

进入当前正在运行的容器

**# 我们通常容器使用后台方式运行的, 需要进入容器,修改一些配置

命令

docker exec -it 容器id /bin/bash**

从容器中拷贝文件到主机

bash 复制代码
docker cp 容器id:容器内路径    目的地主机路径
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker cp 7af535f807e0:/home/Test.java /home

1.5docker run的参数和选项

二、docker-compose介绍

2.1基础介绍

⼀个项⽬的完整环境包括:

  • 应⽤(app);
  • 数据库(MySQL);
  • 缓存(Redis).

例如

docker-compose

容器编排⼯具,允许⽤户在⼀个模版(YAML格式)中定义⼀组相关联的容器,会根据--link等参数对启动的优先级进⾏排序.

2.2主从架构

读写分离实现⽅式

基于程序实现;

基于MySQL⾃带主从同步机制.

节点说明

binlog

  • 记录master节点'增删改查'语句;

relaybinlog

  • 记录从master复制过来的SQL语句;

I/O Thread

  • ⽤于与master节点通信,传输SQL语句信息;

SQL Thread

  • ⽤于从relaybinlog⽂件中读取SQL,并在salve中执⾏.

2.3binary log相关命令

2.4主从同步的作⽤

1.实时灾备;

2.⽤于故障切换;

3.读写分离负载均衡;

4.业务隔离.

主从同步可能引发的问题

1.数据⼀致性问题;

2.从库更新延迟问题.

MySQL可选的主从架构

三、 Docker镜像特性

3.1Docker镜像特性

  • 容器创建时需要制定镜像,每个镜像都有唯⼀的标示Image ID;
  • 与Container ID类似,默认都是128位的,可以使⽤前16位缩略形式;
  • 也可以使⽤镜像名与版本号(TAG)两部分组成唯⼀标识,如果忽略TAG,默认使⽤latest.

镜像的分层

  • 已有的分层只能读不能修改;
  • 上层镜像优先级⼤于底层镜像.

3.2Docker镜像加载原理

3.3Dockerfile

dockerfile是用来构建dokcer镜像的文件!命令参数脚本!

Dockerfile由⼀条⼀条的指令组成,每条指令都对应Linux下的⼀条命令. Docker程序将这些Dockerfile指令翻译成真正的Linux命令. Dockerfile有⾃⼰书写的格式和⽀持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile. Docker程序读取Dockerfile,根据指令⽣成定制的image.
docker build -t lowyard/jdk-tomcat .

另外一种方法

容器 -> 镜像

docker commit ContainerID

ImageName:ImageTag

⼯作在前台的进程(⾄少⼀个)!!!

构建步骤:

1、编写一个dockerfile文件

2、docker build构建成为一个镜像

3、docker run运行镜像

4、docker push发布镜像(DockerHub、阿里云镜像仓库!)
基础知识:

1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序执行

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交!

基础指令

CMD和ENTRYPOINT的区别

追加命令,是直接拼接在我们的ENTRYPOINT命令的后面

3.3实战构建cenos

编写一个dockerfile文件

docker build构建成为一个镜像

bash 复制代码
docker build -f mydockerfile-cento-test -t mycentos:0.1 .

docker run运行镜像

3.4实战构建tomcat

基础知识TomCat目录结构说明

#TomCat目录结构说明:

bin:该目录存放TomCat二进制可执行文件,常用的有startup.bat和shutdown.bat文件,startup.bat用来启动Tomcat,shutdown.bat用来停止Tomcat;

conf:TomCat服务器的配置目录,主要有server.xml(配置服务器信息,如修改端口号,添加虚拟主机等)、tomcat-users.xml(TomCat用户与角色信息,对TomCat后台管理)和web.xml(Web项目部署描述符文件);

lib:Tomcat所需的jar包; logs:存放TomCat的日志文件;

temp:存放Tomcat的临时文件; webapps:存放所部署的Web项目; work:存放Web项目部署运行时生成的文件,如java和class文件; RUNNING.txt:可查看如何配置TomCat环境变量。

1、准备镜像文件tomcat压缩包,jdk的压缩包!

2、编写dockerfile.文件

bash 复制代码
FROM centos:7
MAINTAINER yanyu<1994124137@qq.com>


ADD jdk-8u201-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.86.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.86
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.86
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.86/bin/startup.sh &tail -F /usr/local/apache-tomcat-9.0.86/logs/catalina.out

3、构建镜像

4.测试运行

bash 复制代码
docker run -d -p 8088:8080 --name diytomcat -v /home/yanyu/build/tomcat/test:/usr/local/apache-tomcat-9.0.86/webapps/test -v /home/yanyu/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.86/logs diytomcat

在Docker中运行一个名为diytomcat的镜像,并将容器命名为diytomcat。容器的8088端口映射到主机的8088端口。同时将主机上的/home/yanyu/build/tomcat/test目录挂载到容器中的/usr/local/apache-tomcat-9.0.86/webapps/test目录,将主机上的/home/yanyu/build/tomcat/tomcatlogs/目录挂载到容器中的/usr/local/apache-tomcat-9.0.86/logs目录。

注意防火墙8088端口开启和8080是tomcat默认端口

  1. 访问测试

  2. 发布项目(由于做了卷挂载, 我们直接在本地编写项目就可以发布了)

bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        
</web-app>
html 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>

发现:项目部署成功, 可以直接访问ok!

我们以后开发的步骤:需要掌握Dockerfile的编写! 我们之后的一切都是使用docker进行来发布运行的!

四、容器数据卷

4.1 docker的理解回顾

将应用和环境打包成一个镜像!

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!

这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!

**总结: **容器的持久化和同步操作!容器间数据也是可以共享的!

4.2 使用数据卷

直接使用命令来挂载 -v

docker run -it -v 主机目录:容器目录

实战:安装MySQL

1.获取镜像

2.运行容器

bash 复制代码
docker run -d -p 3304:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456b --name diymysql mysql

-d # 后台运行

-p # 端口隐射

-v # 卷挂载

-e # 环境配置

--name # 容器的名字

匿名和具名挂载

匿名挂载

  1. -v 容器内路径

  2. docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口

这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!

查看所有volume的情况

docker volume命令用于管理Docker卷

Docker卷是Docker容器中持久化存储数据的一种方式,它允许在容器之间共享和重用数据。使用Docker卷,可以将容器内的数据与宿主机进行分离,实现数据的持久化和迁移。

以下是一些常用的docker volume命令:

  • 创建卷 :使用docker volume create命令可以创建一个新卷。例如,要创建一个名为myvolume的卷,可以使用以下命令:

    bash 复制代码
    docker volume create myvolume
  • 列出卷 :使用docker volume ls命令可以列出所有可用的卷。例如,要列出所有的卷,可以使用以下命令:

    bash 复制代码
    docker volume ls
  • 查看卷信息 :使用docker volume inspect命令可以查看指定卷的详细信息。例如,要查看名为myvolume的卷的信息,可以使用以下命令:

    bash 复制代码
    docker volume inspect myvolume
  • 删除卷 :使用docker volume rm命令可以删除一个或多个卷。例如,要删除名为myvolume的卷,可以使用以下命令:

    bash 复制代码
    docker volume rm myvolume
  • 挂载卷到容器 :使用docker run命令时,可以通过-v选项将卷挂载到容器中。例如,要将名为myvolume的卷挂载到容器的/data目录,可以使用以下命令:

    bash 复制代码
    docker run -d --name mycontainer -v myvolume:/data myimage

通过使用docker volume命令,你可以方便地管理Docker卷,并在容器之间共享和重用数据。

具名挂载

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载

总结

  1. 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!

  2. -v 容器内路径 # 匿名挂载

  3. -v 卷名:容器内路径 # 具名挂载

  4. -v /主机路径:容器内路径 # 指定路径挂载

拓展

  1. 通过 -v 容器内容路径 ro rw 改变读写权限

  2. ro readonly # 只读

  3. rw readwrite # 可读可写

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作

DockerFile容器

数据卷容器

多个mysql同步数据!

--volumes-from
`--volumes-from` 是一个在 Docker 命令中使用的标志,它允许你从一个或多个容器挂载(共享)卷。使用这个标志,你可以让新的容器访问其他容器中已经定义的卷,从而重用数据和配置。

以下是 `--volumes-from` 标志的一些典型用途:

  1. **创建新容器时挂载现有容器的卷**:

当你运行一个新容器时,可以使用 `--volumes-from` 标志来指定一个或多个现有容器的名字,从而挂载那些容器的卷到新容器中。

例如,如果你有一个名为 `my_existing_container` 的容器,并且你想创建一个新的容器 `my_new_container` 来共享 `my_existing_container` 的卷,你可以运行以下命令:

bash 复制代码
 docker run -d --name my_new_container --volumes-from my_existing_container my_image

这将会启动 `my_new_container` 并挂载 `my_existing_container` 的所有卷到新容器中。

  1. **管理卷的生命周期**:

由于卷是独立于容器的生命周期的,使用 `--volumes-from` 可以帮助你在容器之间迁移数据,甚至在容器被删除后保留数据。

  1. **实现容器间的数据共享**:

如果你想要在多个容器之间共享数据,而不是通过外部存储或者网络,`--volumes-from` 提供了一种方便的机制来实现这一点。

需要注意的是,从 Docker 1.9 开始,`--volumes-from` 的功能被 `--mount` 标志所取代,后者提供了更加灵活和强大的卷挂载选项。因此,对于较新版本的 Docker,建议使用 `--mount` 而不是 `--volumes-from`。

例如,使用 `--mount` 的替代命令可能是这样的:

bash 复制代码
docker run -d --name my_new_container \
--mount source=my_existing_container,target=/data,type=volume my_image

在这个命令中,`source` 参数指定了现有容器的名字,`target` 参数指定了在新容器中挂载的路径,`type` 参数指定了挂载类型为 `volume`。

结论

容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

五、Docker仓库

Docker Hub

1.地址 注册自己的账号

2.确定这个账号可以登录

3.在我们的服务器上提交自己的镜像

阿里云镜像

  1. 登录阿里云
  2. 找到容器镜像服务
  3. 创建命名空间

commit镜像

bash 复制代码
docker commit 提交容器成为一个新的版本
 
# 命令和git 原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
 
docker commit -a="xiaofan" -m="add webapps app" d798a5946c1f tomcat007:1.0
 
相关推荐
2301_819287122 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la2 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息2 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20152 小时前
STUN服务器实现NAT穿透
运维·服务器
PieroPc2 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
VinciYan3 小时前
基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
python·ubuntu·docker·自动化·jenkins·.net·运维开发
冷曦_sole3 小时前
linux-19 根文件系统(一)
linux·运维·服务器
AI大模型学徒3 小时前
Linux(二)_清理空间
linux·运维·服务器
tntlbb4 小时前
Ubuntu20.4 VPN+Docker代理配置
运维·ubuntu·docker·容器
Gabriel_liao4 小时前
Docker安装Neo4j
docker·容器·neo4j