docker

Docker

一、认识Docker

三大核心概念

镜像:镜像是静态的只读文件

docker_第1张图片

容器

docker_第2张图片

仓库

在CentOS7上安装Docker

#docker
#配置阿里的docker源,不然后期docker拉取镜像将会特别慢!!!
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker
systemctl start docker
#开机启动
systemctl enable docker
[root@hadoop01 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

配置镜像

  • 没这个文件的话手动新建

阿里云

科大: /etc/docker/daemon.json

vim /etc/docker/daemon.json
#{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]}
sudo systemctl daemon-reload
sudo systemctl restart docker

二、基本命令

pull

可以在:后加版本,默认最新


#docker pull 镜像名
docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ... 
5.7: Pulling from docker.io/library/mysql
a076a628af6f: Pull complete 
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
....#省略

docker run -itd --name=mycentos centos:7 /bin/bash echo "hello world"
  • -i :–interactive表示以交互模式运行容器(让容器的标准输入保持打开),允许你对容器内的标准输入 (STDIN) 进行交互。
  • -t:为容器重新分配一个伪输入终端
  • -d 守护进程 后台运行,并返回容器ID
  • –name:为容器指定名称
  • centos:7指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。名字格式:[a-zA-Z0-9][a-zA-Z0-9_.-]
  • /bin/bash echo “Hello world”: 在启动的容器里执行的命令
  • docker: Docker 的二进制执行文件。
  • run 创建并运行容器,如果没有镜像则自己下载
  • -p #指定容器的端口 -p 8080(宿主机):8080(容器)
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
    -P(大写) 随机指定端口

自己闲的没事测试:

#只有i参数
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -i centos:7
fa^H^H^[[Daf^H^[[3~^C^C
^C
d
/bin/bash: line 3: d: command not found
yum --version
3.4.3
/bin/bash: line 4: $'c\be': command not found
exit	#可以交互但没有伪终端,默认用bash运行;用exit退出

#只有t参数
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -t centos:7
[root@38b749b8ce77 /]# fe
exit

fe^H^H
f^C		#只有伪终端没有交互,^C退出

#it都有
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -it centos:7
[root@726a73872904 /]# fe
bash: fe: command not found

#只有d
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -d --name=cd centos:7
1ca7b3291711f368e0135a070fafae29aedd4796df5efd4fb8bda9b96f21112a
#也是运行一下就停了
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS   
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS   
1ca7b3291711        centos:7            "/bin/bash"         31 seconds ago      Exited (0) 30 seconds ago   
#不要把可选参数的位置放错!后面是放容器内命令(COMMAND)的,参数错放在那里会启动不了!
#只有-d,有容器命令的话可以一直运行!要不然也是直接关上,运行不了!
#总结:-itd和带COMMAND及-d的可以后台运行,只有-d的不可以!
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止

#什么参数都没有
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run centos:7
#没有正在运行的容器
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS   
#创建3s之后就停止了
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS   
83cea50b6796        centos:7            "/bin/bash"         41 seconds ago      Exited (0) 38 seconds ago 
6a36f0c80a2c        centos:7            "/bin/bash"         13 hours ago        Exited (137) 13 hours ago  
4f1a92ed1272        centos:7            "/bin/bash"         13 hours ago        Exited (130) 13 hours ago  

回归正题,其他常用命令

查看运行中的容器

[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
  #-a, --all     	 #列出当前正在运行的容器 + 带出历史运行过的容器
  #-n=?, --last int   #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
  #-q, --quiet        #只列出容器的编号
#关闭对应id/name的容器 很多时候用id或者name都可以
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker stop 38b749b8ce77
38b749b8ce77
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

状态:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38b749b8ce77 centos:7 “/bin/bash” 18 minutes ago Up 18 minutes musing_cray

容器状态(STATUS)有七种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

接着看其他常用命令

关闭容器并不是停止容器!每次run都是创建了新的容器!stop之后容器还在,下次还可以根据ID/NAME启动它!rm才是删除!

注意stop、rm、exit,也就是关闭、删除、退出的区别!

查看所有容器

docker ps -a

退出容器

exit 		#容器直接退出
ctrl +P +Q  #容器不停止退出 	在交互模式下用
启动和停止容器的操作
docker start 容器id	#启动容器
docker restart 容器id	#重启容器
docker stop 容器id	#停止当前正在运行的容器
docker kill 容器id	#强制停止当前容器

删除&&高级删除

#linux命令,查出所有镜像
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker images -aq
a70d36bc331a
040bdb29ab37
8652b9f0cb4c
647c57f8354f
647c57f8354f
#删除容器
docker rm 容器id或名字   				#删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq)  	 #删除所有的容器
docker ps -a -q|xargs docker rm  #删除所有的容器
列出所有运行的容器
docker ps 命令  		#列出当前正在运行的容器
  -a, --all     	 #列出当前正在运行的容器 + 带出历史运行过的容器
  -n=?, --last int   #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
  -q, --quiet        #只列出容器的编号
容器的生命周期

**这里写图片描述**

容器的生命周期一共有五个状态分别为

  • created 初建状态
  • running 运行状态
  • stopped 停止状态
  • paused 暂停状态
  • deleted 删除状态

注:椭圆为容器的状态

image-20200514214313962

DockerFile

dockerfile 的每一行命令都会生成一个镜像层

Docker Compose,和脚本差不多。

常用命令

docker_第3张图片

案例:打包java应用

FROM openjdk:8-jre
ADD target/*.jar /application.jar
ENTRYPOINT ["java", "-jar","/application.jar"]

Docker Compose

Docker Compose允许用户通过docker-compose.yml文件来定义一组相关联的容器为一个工程(project)。一个工程包含多个服务(service),每个服务中定义了创建容器时所需的镜像、参数、依赖等。

工程级:Docker Compose

服务级:一个镜像

一个工程包含多个服务,一个Docker Compose的yml文件管理多个image

一个image可以直接指定,也可以基于Dockerfile文件构建

sshd

备份与恢复

commit方式

1、备份容器

docker commit -p <容器ID> 备份命名

将备份的镜像导出到本地

docker save 备份名 > 位置/名.tar

2、恢复容器

docker load < 本地容器路径
#或者docker load -i 本地容器路径

查看镜像可以看到导入成功

Dockerfile方式

在项目文件夹下创建Dockerfile文件,然后在项目文件夹下

docker build -t 自己起个镜像名儿 .

类似python的requirements.txt的使用方式

联合文件系统

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。

联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。

Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。

Docker 目前支持的联合文件系统包括 OverlayFS, AUFS, Btrfs, VFS, ZFSDevice Mapper

chroot & pivot_root可以修改进程和系统的根目录到一个新的位置

namespace划定一个个的命名空间,然后把进程划分到这些命名空间中。而每个命名空间都是独立存在的,命名空间里面的进程都无法看到空间之外的进程、用户、网络等等信息。

CGroup它可以划定一个个的分组,然后限制每个分组能够使用的资源,比如内存的上限值、CPU的使用率、硬盘空间总量等等。

附录

maven生成docker镜像

./mvnw spring-boot:build-image

开启远程API

修改docker.service文件

vim /usr/lib/systemd/system/docker.service

需要修改的部分:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

修改后的部分:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

配置生效

systemctl daemon-reload

重新启动Docker服务

systemctl stop docker
systemctl start docker

开启2375端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload

无法连接到 Docker for Windows:需要事先在 Docker设置 的 General 部分,启用 Expose daemon on tcp://localhost:2375 without TLS 选项(其作用是:将docker与本地的连接设置为不需要TLS加密)。

案例

Zookeeper

docker pull docker.io/zookeeper:latest
docker run --name zk --privileged=true  -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart always -d -v $(pwd)/conf:/conf zookeeper

–name zk :自定义名称

–privileged=true :开放权限 是否让docker 应用容器 获取宿主机root权限(特殊权限-),否则docker无法读取映射配置

-p 2181:2181 -p 2888:2888 -p 3888:3888: 端口映射

   1、2181:对cline端提供服务

  2、3888:选举leader使用

  3、2888:集群内机器通讯使用(Leader监听此端口)

-d :后台运行

$(pwd)/conf:/conf :配置文件映射

或者

docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:3.6

kafka

先pull的zookeeper3.6,用的openjdk11

9002端口

主机kafka运行在自己的容器环境,宿主机的host不起作用

启动后,如果使用docker logs zookeeper或者kafka查看日志,会有8小时时差,可以在run命令里添加参数-e TZ="Asia/Shanghai"解决,楼主的方式启动后容器内时间和虚拟机时间是一致的,但是日志的时间还是不对

[0](javascript:[回复](javascript:

kafka要绑定宿主机,就是ifconfig里docker0的IP地址

172.17.0.2:2181/kafka

报错集锦

配置了consumer订阅,却仍报错:没有订阅任何topic

 To use the group management or offset commit APIs, you must provide a valid group.id in the consumer configuration.
2023-04-26 05:52:44 [alerter-worker-0] ERROR com.usthe.alert.AlerterWorkerPool - workerExecutor has uncaughtException.

java.lang.IllegalStateException: Consumer is not subscribed to any topics or assigned any partitions
	at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1223)

原因:没有配置consumer的groupid

properties.put("group.id", "console-consumer-myapp");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "console-consumer-myapp")

docker_第4张图片

docker_第5张图片

  • 权限问题:什么时候要root?
  • docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint quirky_allen_whatday的博客-CSDN博客

原因:没有配置consumer的groupid

```java
properties.put("group.id", "console-consumer-myapp");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "console-consumer-myapp")

你可能感兴趣的:(docker,运维,linux)