docker学习总结

本文全面介绍了Docker的安装、配置及使用方法,包括镜像加速、基本指令、Dockerfile编写、docker-compose与swarm集群部署。深入解析了CMD与ENTRYPOINT指令的区别,以及如何在容器内执行宿主机命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker总结

1.安装docker

//获取最新版本的 Docker 安装包,默认自己安装和启动

wget -fsSl https://get.docker.com/ | bash -s docker --mirror Aliyun

或者

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -a 命令查看你当前的内核版本

1)使用 root 权限登录 Centos。确保 yum 包更新到最新

yum update

2)卸载旧版本(如果安装过旧版本的话)

yum remove docker docker-common docker-selinux docker-engine

3)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

4)设置yum源

yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo

5)可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

6)安装docker

yum install docker-ce-18.03.1.ce

7)启动并加入开机启动

systemctl start docker
systemctl enable docker

8)验证安装是否成功(有client和service两部分表示docker安装启动都成功了)

docker version

9)卸载旧版本的包(如果有的话)

yum erase docker-common-2:1.12.6-68.gitec8512b.el7.centos.x86_64

10)国外镜像一般很难访问,建议配置阿里云镜像。

yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.镜像加速(可选),不做下载镜像速度慢

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://4e70ba5d.m.daocloud.io

3.重启docker

service docker restart或者systemctl restart docker

4.docker基本的相关指令,

以tomcat为例,tomcat也可以替换成容器id的前4位数字做为唯一标识

docker network create -d overlay xuncai_net1
docker network disconnect --force xuncai_net1 zookeeper-master

//docker hub上搜索镜像
docker search tomcat

//拉镜像
docker pull tomcat

//启动容器
docker run --name tomcat-test2 -p 7070:8080 -v /home/emg-dev-02/webapps/emap-test:/usr/local/tomcat/webapps/ -d tomcat

//交互模式进入容器
docker exec -it tomcat /bin/bash

//看容器日志
docker logs tomcat

//启动容器
docker start tomcat

//关闭容器
docker stop tomcat

//删除容器
docker rm tomcat

//删除镜像
docker rmi tomcat

//查看所有的容器
docker ps -a

//查看正在运行的容器
docker ps

//查看日志最后几行或者时间限制下的日志
docker logs -f -t --since="2017-05-31" --tail=10 edu_web_1

--since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。

-f : 查看实时日志

-t : 查看日志产生的日期

-tail=10 : 查看最后的10条日志。

edu_web_1 : 容器名称

5.Dockerfile文件的编写

需要了解几个关键词(FROM,ADD,CMD)即可,需要用到别的,自己百度即可

例如:启动springboot的jar包,同时内部调用so文件,如下:

FROM openjdk:8

ADD emap-wgtochina-0.0.1-SNAPSHOT.jar emap-wgtochina.jar

ADD libwgtochina.so libwgtochina.so

CMD java -jar emap-wgtochina.jar

例如:加载war包,启动tomcat,如下:

FROM tomcat

ADD emap-redirect.war /usr/local/tomcat/webapps/

CMD ["catalina.sh", "run"]

运行Dockerfile文件,也就是构建镜像

docker build -t test/tomcat .

注意最后面的点别漏了

其中扯扯ENTRYPOINT和ADD这两个指令

  CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令,单从功能上来看,这两个命令几乎是重复的。
  CMD 和 ENTRYPOINT 指令都支持 exec 模式和 shell 模式的写法,所以要理解 CMD 和 ENTRYPOINT 指令的用法。
  使用 exec 模式时(CMD ["executable","param1","param2"]),容器中的任务进程就是容器内的 1 号进程,当运行任务的进程作为容器中的 1 号进程时,我们可以通过 docker 的 stop 命令优雅的结束容器,exec 模式的特点是不会通过 shell 执行相关的命令,所以像 $HOME 这样的环境变量是取不到的。例如:
  FROM ubuntu
  CMD [ "echo", "$HOME" ]
  但是可以通过这样搞定
  FROM ubuntu
  CMD [ "sh", "-c", "echo $HOME" ]
  使用 shell 模式时,docker 会以 /bin/sh -c "task command" 的方式执行任务命令。也就是说容器中的 1 号进程不是任务进程而是 bash 进程。
  注意命令行参数可以覆盖 CMD 指令的设置,但是只能是重写,却不能给 CMD 中的命令通过命令行传递参数,但是ENTRYPOINT指令是可以的。

给镜像打个tag

docker tag test/tomcat test/tomcat:v1

推送镜像

docker push test/tomcat:v1

6.docker-compose的使用,我的理解docker-compose就是启动容器的脚本,也就是偷懒工具

6.1.安装docker-compose工具

apt update

apt install docker-compose或者pip install docker-compose

6.2 查看docker-compose版本

docker-compose --version

6.3 docker-compose.yml文件格式
具体关键词的意思请看:

https://blog.youkuaiyun.com/qq_36148847/article/details/79427878

我这列几个例子

redis的:

version: '3'

services:

 redis:

  container_name: redis

  image: "registry.emg.local/tools/redis:5.0.3"

  ports:

  - "6378:6379"

  volumes:

  - /home/emg/docker-compose/redis/redis.conf:/etc/redis/redis.conf

  command: redis-server /etc/redis/redis.conf

mongo的:

version: '3'

services:

mongo:

  container_name: mongo

  image: "registry.emg.local/tools/mongo:4.0.6"

  ports:

  - "27018:27017"

  volumes:

  - /home/emg/docker-compose/mongo/data:/data/db

  command: ["mongod", "--bind_ip","0.0.0.0"]

  restart: always

postgres:

version: '3'

services:

postgres:

  container_name: postgres

  image: "registry.emg.local/tools/postgres:9.6.12"

  privileged: true

  ports:

  - "5432:5432"

  environment:

  - POSTGRES_PASSWORD=${pwd}

  - PGDATA=/var/lib/postgresql/data/pgdata

  volumes:

  - /mnt/postgres/data:/var/lib/postgresql/data/pgdata

  restart: always

kafka的

version: '3'
services:
 zoo1:
  image: registry.emg.local/tools/zookeeper:latest
  hostname: zoo1
  ports:
   - "2181:2181"
  container_name: zookeeper
 kafka1:
  image: registry.emg.local/tools/kafka:latest
  ports:
   - "9092:9092"
  environment:
   KAFKA_ADVERTISED_HOST_NAME: 192.168.41.88
   KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
   KAFKA_BROKER_ID: 1
   KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
   KAFKA_CREATE_TOPICS: "stream-in:1:1,stream-out:1:1"
  depends_on:
   - zoo1
  container_name: kafka

springboot的jar包

version: '3'

services:

convert:

  container_name: convert

  image: "registry.emg.local/traffic/emap-wgtochina:v2"

  ports:

  - "9040:9040"

  volumes:

  - /home/emg/docker-compose/wgtochina:/home

  restart: always

  deploy:

  replicas: 2

等等。。

7.docker swarm的部署方式

详细介绍请看:

https://www.cnblogs.com/drawnkid/p/8487337.html

我这里说下几个关键指令

//创建一个Swarm集群 主机ip即可
docker swarm init --advertise-addr 192.168.99.1

//来查看当前swarm集群的状态
docker info

//将节点加入到swarm集群中
docker swarm join --token SWMTKN-1-2bgkinnbc0rmlj6kpotyrlj0uz51l2ikinttsk960dxro558x4-6zajfnahtv9ye39momddh5kru 192.168.99.1:2377

//查看集群节点情况
docker node ls

//查看单节点的服务进程情况
docker node ps 节点id

//如果忘记token,则查找
docker swarm join-token worker

//根据docker-compose.yml文件,启动单节点多个实例
docker stack deploy --compose-file docker-compose.yml syncdata

//查看docker servie列表
docker service ls

//查看单个服务的部署情况
docker service ps 服务id

8.docker 部署指令

1.根据容器创建新镜像

docker commit  [containerID]  newIMGName:tag

2.tar包导入到镜像

docker load < ./xxx.tar

3.把镜像导出成tar

docker save 镜像名称:版本号 -o ./xxx.tar

9.docker容器内如何执行宿主机命令?

1.Docker和宿主机共用一个内核,Namespace的隔离依然没有完全隔离Linux资源,如:/proc、/sys、/dev/sd*等目录;
2.使用Docker问题:在Docker容器中执行top、free命令,看到的资源情况是宿主机的资源消耗比例,而不是这个容器被限制了多少CPU、内存;
3. 设置容器特权级运行:–privileged,比如容器内操作内核模块、挂载USB磁盘、修改MAC地址等,设置privileged=true即可;
4. 设置容器特权白名单:–cap-add,privileged=true等同于cap-add=ALL,其权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加权限限制,只提供给容器必须的权限。

修改Docker Compose配置文件

pid: host
privileged: true

pid=host,使用宿主机命名空间,方便容器获取到宿主机所有进程信息,其中/proc/1作为nsenter的目标;
privileged=true,使得docker容器有root权限执行宿主机命令,确保从容器执行命令时不会报权限不足提示;

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令,位于util-linux包中,格式:nsenter -m -u -i -n -p -t ;

交互模式进入容器 nsenter执行宿主机命令查看IP信息:nsenter -n -t 1 ip addr

m表示进入mount命令空间、-u表示进入uts命令空间、-i表示进入ipc命令空间、-n表示进入net命令空间、-p表示进入pid命令空间、-U表示进入user命令空间、-t表示被进入命名空间的目标进程的pid;

可以先输入nsenter -n -t 1进入1空间,然后输入ip addr命令,最后执行exit退出。

容器中查询宿主机的mac地址
nsenter -m -u -i -n -p -t 1 ip addr show dev eth0 | grep -oP 'link/ether \K[a-f0-9:]{17}'
或者
nsenter -m -u -i -n -p -t 1 ifconfig eth0|grep ether|awk '{print $2}'

目前总结到这里,以后会有补充。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彼岸花@开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值