一篇Docker笔记,如有错误还请指出。希望对你有所帮助。
linux
源
yum install epel-release -y
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrorsaliyun.com/repo/Centos-7.repo
安装
centos。 https://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.