一篇Docker笔记,如有错误还请指出。希望对你有所帮助

linux

yum install epel-release -y
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrorsaliyun.com/repo/Centos-7.repo

安装

centoshttps://docs.docker.com/engine/install/centos/

#卸载
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#需要的安装包
yum -y install gcc
yum -y install gcc+
yum install -y yum-utils

#设置镜像仓库
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo#国外
    
    
    yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#阿里
#更新软件包索引
yum makecache fast

#查看版本
yum list docker-ce --show-duplicates
#安装docker   docker-ce 社区版  ee企业版
$ sudo yum -y install docker-ce docker-ce-cli containerd.io

#设置开机启动
systemctl enable docker
#启动docker
systemctl start docker
#使用docker versio 查看是否安装成功
#hello-world  会自动下载 hello-world镜像
docker run hello-word
#查看下载的镜像 docker images

如果报错 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
执行下面命令

systemctl daemon-reload
sudo service docker restart
sudo service docker status 
#docker 卸载
$ sudo yum remove docker-ce docker-ce-cli containerd.io
#docker 安装的默认路径
$ sudo rm -rf /var/lib/docker

阿里云镜像加速

登陆阿里云找到镜像服务

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://a4fyjv0u.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

#查看是否配置成功
docker info |grep aliyun

docker常用命令

docker version  #版本信息
docker info			#显示系统信息 包括镜像和容器数量
docker --help

帮助文档:https://docs.docker.com/reference/

镜像命令

docker images 查看所有本地机器上的镜像

docker images 

#解释
REPOSITORY   #镜像的仓库源
TAG						#镜像的标签
IMAGE ID			#镜像的Id
CREATED				#镜像的创建时间
SIZE					#镜像的大小

#可选项
-a,-all 	#列出所有镜像
-q,-quiet	#只显示镜像ID

docker search 搜索镜像

docker search mysql

#可选项  通过收藏来过滤
--filter=START=3000	

docker pull 下载镜像

# 下载镜像 docker pull 镜像名 [:tag] 
decker pull mysql:5.7

docker rmi 删除镜像

docker rmi -f 镜像id	#删除指定容器
docker rmi -f 镜像id 镜像id 镜像id #删除多个容器
decker rmi -f $(docker images -aq)  #删除所有容器

docker 导入导出

#导出
docker save 镜像id > nginx01:1.0.tar
#导入
docker load < nginx01:1.0.tar

容器命令

docker pull centos

新建容器启动

  docker run [可选参数] images
  #参数
  --name="NAME"     容器名称 
  -d								后台方式运行
  -it								使用交互方式运行,进入容器查看内容
  -p								指定容器的端口 -p 8080:8080
  			-p	ip:主机端口:容器端口
  			-p	主机端口:容器端口
  			-p	容器端口
  -P								随机指定端口
  #启动并进入容器 
  docker run -it centos /bin/bash
  #退出
  exit
  

列出所有运行的容器

docker ps
#参数
	-a #列出当前正在运行的容器+历史运行过的程序
	-n=?#显示出最近创建的容器 如 docker -a -n=1
	-q #显示容器编号  如 docker ps -aq

退出容器

exit	#直接退出
ctrl+p+q	#容器不停止退出

删除容器

docker rm 容器id  #删除指定容器。删除运行中的容器 rm -f
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q|xargs docker rm #删除所有容器

启动和停止容器

docker start 容器id。#启动容器
docker restart 容器id #重启容器
docker stop  容器id #停止容器
docker kill 容器id。#强制终止程序

常用其他命令

docker logs -tf --tail 10 容器id  #查看容器日志
docker top 容器id    #查看运行中的容器进程
docker inspect 容器id  #查看镜像元数据
docker status 容器id #查看cpu状态

docker logs 容器id  #查看容器日志  参数 -f

进入当前正在运行的容器

#进入容器后打开一个新的终端
docker exec -it 容器id  /bin/bash 
#进入容器正在执行的会终端
docker attach 容器id

从容器中拷贝

docker cp 容器id :容器文件路径 主机路径 #如 decker cp eqweqfd:/home/test.java /home

nginx

docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx

elasticsearch

#https://hub.docker.com/_/elasticsearch
#下载and启动
docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#设置es内存
docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512 -Xmx512" elasticsearch:7.6.2

portainer

docker图形化界面管理工具

docker run -d -p 8080:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer 

commit镜像

docker commit  提交容器成为一个新的副本
docker commit -m="提交描述" -a="作者" 容器id  目标镜像:[tag]

数据卷

#-v直接挂载。docker run -it 主机目录:容器目录
docker run -it -v /home/test:/home centos /bin/bash

环境变量传递

docker run -e A_OPTS=abcdefgh,B_OPST=2345 nginx

mysql

docker pull mysql:5.7
#密码配置 docker run --name name-mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7
#启动
docker run -d -p 3310:3306 -v /home/mysql/conf:ect/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7

具名和匿名挂载

#匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有volume
docker volume ls
#具名挂载
docker run -d -P run --name nginx02 -v juming:/etc/nginx
#查看具体挂载目录
docker volume inspect jvming

数据卷容器

#数据共享
docker run -it --name centos02 --volume-from docker01 centos:1.0

dockerFile

指令

FROM 							# 基础镜像
MAINTAINER				# 镜像作者 姓名+邮箱
RUN								# 运行命令
ADD								# 步骤,tomcat镜像。添加内容
WORKDIR						# 镜像的工作目录
VOLUME						# 挂载目录
EXPOSE						# 保留端口配置
CMD								# 指定容器启动时候运行的命令,只有最后一个会生效 可被替代
ENTRYOPOINT				# 指定容器启动的时候运行的命令,可追加指令
ONBUILD						# 当构建一个被继承DockerFile 这时候就会运行ONBUILD 的指令 触发指令
COPY							# 类似于ADD 将我们的文件拷贝到镜像中
ENV								# 构建的时候设置环境变量

编写dokerFile

FROM centos
MAINTAINER  bo<317925605@qq.com>
USER root
ENV MYPATH /usr/local
WORKDIR $MYPATH        #默认 /
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash


# build 镜像
docker build -f mydockerfile-centos -t mycentos:1.0 .

# 查看镜像创建历史
docker history 容器id

官方命名Dockerfile,build会自动寻找这个文件 就不需要-f指定

手动打包tomcat镜像 dockerFile

FROM centos
MAINTAINER bo<317925605@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/

发布镜像 dockerHub

#登陆dokerHub
docker login -u name
#上传镜像
docker push userName/tomcat:1.0

发布阿里云镜像

阿里云-》镜像服务-〉创建命名空间-》创建仓库(本地仓库)

# 登陆aliyun 镜像仓库
sudo docker login --username=111111111 registry.cn-shenzhen.aliyuncs.com
Password:
#上传镜像。sudo docker push registry.cn-shenzhen.aliyuncs.com/1111_docker/docker:[镜像版本号]
docker push userName/tomcat:1.0

docker 网络

# 查看镜像网卡  存在一个docker分配的ip   evth-pair技术 桥接
docker exec -it tomcat01 ip addr
# 查看docker 网络
docker network ls
# 移除
docker network rm networkID

网络模式

bridge:桥接 docker默认

none:不配置网络

host:和宿主机共享网络

container:容器网络连通

自定义网络

 # 创建一个网络
 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 net001
 # 查看网络
 docker network inspect net001
 # 启动两个自定义网络容器
 docker run -d -P --name tomcat01 --net net001 tomcat
 docker run -d -P --name tomcat02 --net net001 tomcat
 # 再次查看网络
 docker network inspect net001
 # ping
 docker exec -it tomcat01 ping 192.168.0.3
 docker exec -it tomcat01 ping tomcat02

不同的集群使用不同的网络 redis集群 mysql集群

网络连通

# 测试 将docker0(其他虚拟网卡)网络的镜像连接到 net001网络
docker network connect net001 tomact--01 #(其他网卡上的镜像)
# 再次查看网络  发现会新增一个。# tomact-net-01 一个容器两个ip!
 docker network inspect net001
 docker exec -it tomcat01 ping tomact--01

idea 发布镜像到服务器 远端部署

# 打开docker配置文件ß
vim  /usr/lib/systemd/system/docker.service
# 在ExecStart后追加链接的端口
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
# 重启docker
systemctl daemon-reload
systemctl restart docker

idea安装docker插件-》配置服务器上docker地址-〉编写dockerfile -》configurations添加dockerfile(容器名称、路径、镜像名tag、映射端口)-〉项目打包package-》运行


Docker Compose

compose是Docker开源项目 需要安装

官方yml 编写多个容器配置

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker-compose up . 编译

Compose 安装

#官方下载地址(下载慢 自己找国内)
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#进入 /usr/local/bin/  授权
sudo chomd +x docker-compose
docker-compose version

官方demo。https://docs.docker.com/compose/gettingstarted/

流程:创建网络-》执行docker-compose.yml->启动服务

默认的服务名规则:文件名_ 服务名 _num

yaml规则

docker-compose.yaml。 https://docs.docker.com/compose/compose-file/compose-file-v3/

# 共3层

version: '' # 版本号
services:   # 服务
	服务1:web
		#服务配置
		images
		build
		network
		depends_on # 启动顺序(依赖)
	服务2:redis
#其他配置 网络 卷 全局规则
volumes:
networks:
configs:

Docker Swarm

管理节点 工作节点

# 初始化主节点
docker swarm init --advertise-addr 私网ip
# 获取令牌
docker swarm join-token manager
docker swarm join-token worker
# 其他服务器可以通过上面 加入节点
docker swarm join --token SWMTKN-1-4sw454dfs4h4....
# 主节点查看
docker node ls

Raft协议

Raft协议:保证大多数节点存活才可以用。集群最少大于3台 存活数>1

如果是双主 一台主挂掉 整个系统就挂

# docker run 容器启动。不具备扩缩容器。 service 服务具有扩缩容器,滚动更新。。
# 可能在其他机器上启动 (随机 )
docker service create -p 8888:80 --name nginx01 nginx
# 查看服务
docker service ps nginx01
docker service ls
docker service inspect nginx01
# 创建10个副本  动态扩缩容
docker service update --replicas 10 nginx01
# 可以直接 更新副本数为1个
docker service update --replicas 1 nginx01
# 和上面一样 动态扩缩容
docker service scale nginx01=10
# 移除服务
docker service rm nginx01

Q.E.D.