百度: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker集装箱
image镜像
安装
# 更新下载工具
apt-get update
# 安装docker
apt-get install -y docker.io
常用命令
service docker [status|start|stop|restart| ]
或者
systemctl docker [status|start|stop|restart| ]
-
docker inspect xxx //image name 查看某镜像详细信息
-
查看正运行的镜像
docker ps //查看正在运行的实例
docker ps -all 查看所有运行过的实例
-
docker images //所有镜像
-
docker run 镜像名称 //运行
-e 指定环境变量
-
docker stop 镜像名称 //停止镜像
-
docker exec 镜像名称 命令 //进入镜像
docker exec -it 镜像id /bin/bash
- docker logs -f 镜像ID //实时查看log
docker logs -f 镜像id
- docker save是将一个镜像导出成一个tarball文件,对应的导入命令是docker load,将该文件导入成一个镜像。
- docker export是将一个容器导出成一个tarball文件,对应的导入命令时docker import,将该文件导入成一个镜像(注意不是容器)。
###
docker 的镜像与容器都存储在 /var/lib/docker
标准 隔离
镜像 容器 仓库(BUILD SHIP RUN)
安装docker
sudo apt-get update sudo apt-get install docker.io
或者
#安装
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && sudo apt-get update && sudo apt-get install -y docker-ce
WSL
sss
# wsl 显示列表
wsl -l -v
# 检查状态
wsl --status
# 查看版本
wsl --version
# Shutdown
wsl --shutdown
wmmem消耗内存大,
在 WSL2 中使用 Docker 时,可能会造成 Vmmem 进程消耗掉全部的内存,导致机器卡顿,且通过任务管理器或者通过 taskkill 都无法终止此进程。
方案
- 在用户目录下新建文件 .wslconfig,增加下面的配置,限制其内存占用:
[wsl2]
memory=6GB
swap=0
localhostForwarding=true
memory 的配置根据自己机器的内存配置,比如可以配置成机器内存的 1 / 3 或 1 / 4,以保证其他应用流畅使用。更多配置可查看 WSL 的 发行说明
- 重启 WSL2:打开 服务(可通过 Win + R,运行 services.msc),找到 LxssManager 服务,将其重启
开启docker服务
sudo service docker start
-
查看docker版本
docker version
-
查看docker信息
docker info
-
查看docker所有镜像
docker images
-
搜索名为hello-world的docker镜像
docker search hello-world
-
下载名为hello-word的镜像
docker pull hello-world
docker run image-id/repository
-
查看docker容器进程
docker ps # 默认查询正在运行的,-a 查看所有,-l 查看最新创建的,-n=1 查看最后创建的1个
-
终止容器运行
docker stop 容器名或容器ID
- 强制终止容器运行
docker kill 容器ID
-
删除容器
docker rm 容器名或容器ID
-
删除所有容器
docker rm $(docker ps -a -q)
-
在当前目录创建镜像
docker build -t aaaa:1.0 .
//指定目录dockerfile
docker build -t aaaa:1.0 -f /root/Dockerfile
-
镜像打tag(类似于提交前的commit)
docker tag aaaa:1.0 myregistry/aaa:1.0
-
上传镜像
docker push image-id
docker push myregistry/aaa:1.0
-
新创建一个镜像
docker run -it 要生成的镜像的名称 /bin/bash
-t 表示在新容器内指定一个伪终端或终端 -i 表示允许我们对容器内的 (STDIN) 进行交互
-
启动或进入容器
docker start 容器ID # 启动容器 docker exec -it 容器ID /bin/bash # 进入容器 exit # 退出容器
-
提交镜像的修改
docker commit -m “修改注释” -a “作者名字” 容器环境ID 生成后的镜像名称
-
删除镜像
docker rmi 镜像名/镜像ID
-
查看网络
docker network ls
-
清理无用的容器和网络
docker system prune -f 清理无用的容器和网络
主机与容器之间的文件复制
# 从主机复制到容器
docker cp host_path containerID:container_path
# 从容器复制到主机
docker cp containerID:container_path host_path
修改为国内镜像地址,修改 /etc/default/docker
DOCKER_OPTS=”–registry-mirror=https://registry.docker-cn.com”
-
修改为自己的阿里云镜像
linux修改 /etc/docker/daemon.json文件下的配置后重启,
{ “registry-mirrors”: [“https://xxxx.mirror.aliyuncs.com”] }
-
登陆阿里云先建镜像仓库
docker login --username=15***4072 registry.cn-shanghai.aliyuncs.com ***********99*
-
docker 运行镜像仓库
-
docker官方提供镜像 registry 第一种
# pull镜像 docker pull registry # 运行镜像 docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d rgistry # 建立完成后修改客户端docker的/etc/docker/daemon.json 镜像仓库配置
-
docker官方提供镜像 registry 第二种 自建docker仓库-文章链接
# $ docker pull registry:2 $ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2 # http://127.0.0.1:5000/v2 返回{}表示正常 # 建立完成后修改客户端docker的/etc/docker/daemon.json 镜像仓库配置 # 验证 (本地先下载好nginx镜像) ##1.镜像打包 docker tag nginx:latest localhost:5000/nginx:latest ##2.推送镜像 docker push localhost:5000/nginx:latest ##3.访问 http://127.0.0.1:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了: {repositories:["nginx"]} ##4.下载该镜像 docker pull localhost:5000/镜像名:版本号 例如 docker pull localhost:5000/nginx:latest
-
harbor 的搭建
docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。
第三方的,理论更好用, 地址
-
-
docker 添加不安全的镜像仓库
# vi /etc/docker/daemon.json { # 非安全的仓库地址,自己的镜像仓库 "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] #镜像地址 } # 修改后重启 systemctl daemon-reload ststemctl restart docker
Dockerfile 基本语法与关键字
FROM,RUN,CMD,ENTRYPOINT, EXPOSE
-
FROM 基于基础镜像
-
RUN 执行命令
-
ADD 拷贝文件
ADD ./ /usr/local/xxx # 将当前目录下所有文件拷贝到指定目录去
-
WORKDIR # 设置当前目录为工作目录
WORKDIR /usr/local/xxx
-
CMD 运行命令
CMD [“python3” , “./main.py”]
-
EXPOSE 对外暴露端口命令
Dockerfile 常用指令
指令 | 语法 | 说明 |
---|---|---|
FROM | FROM <image>:<tag> |
指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag ,那么默认值为latest |
MAINTAINER | MAINTAINER <name> |
指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用LABEL |
LABEL | LABEL <key>=<value> ... |
功能是为镜像指定标签。也可以使用LABEL 来指定镜像作者 |
RUN | RUN <command> |
构建镜像时运行的Shell 命令,比如构建的新镜像中我们想在/usr/local 目录下创建一个java 目录 |
ADD | ADD <src>... <dest> |
拷贝文件或目录到镜像中。src 可以是一个本地文件,还可以是一个url 。然后自动下载和解压 |
COPY | COPY <src>... <dest> |
拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压 |
EXPOSE | EXPOSE <port> [<port>/<protocol>...] |
暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP |
ENV | ENV <key>=<value> ... |
设置容器内环境变量 |
CMD | CMD ["executable","param1","param2"] |
启动容器时执行的Shell 命令。在Dockerfile 中只能有一条CMD 指令。如果设置了多条CMD ,只有最后一条会生效 |
ENTRYPOINT | ENTRYPOINT ["executable", "param1", "param2"] |
启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖,如果设置了多条ENTRYPOINT ,只有最后一条会生效 |
WORKDIR | WORKDIR param |
为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录 |
VOLUME | VOLUME ["param"] |
指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时 |
容器编排 docker-compose
docker-compose.yml 将多个镜像一起处理
docker-compose 启动会根据 yml所在文件夹命名,修改方式如下
-
命令启动
docker-compose -p $PROJECT_NAME up
. -
yml文件启动
从Docker版本17.06.0开始,可以直接在docker-compose.yml文件中设置变量.
在docker-compose.yml文件夹下穿件有自定义项目名称和设置的.env文件
COMPOSE_PROJECT_NAME=SOMEPROJECTNAME
子命令
命令 | 描述 |
---|---|
docker-compose build | 构建或重建服务 |
docker-compose convert | 将compose文件转换为平台的规范格式 |
docker-compose cp | 在服务容器和本地文件系统之间复制文件/文件夹 |
docker-compose create | 为服务创建容器 |
docker-compose down | 停止并移除容器,网络 |
docker-compose events | 从容器中接收实时事件。 |
docker-compose exec | 在正在运行的容器中执行命令。 |
docker-compose images | 列出容器使用的镜像 |
docker-compose kill | 强制停止服务容器。 |
docker-compose logs | 查看容器的输出 |
docker-compose ls | 运行compose项目的列表 |
docker-compose pause | 暂停服务 |
docker-compose port | 输出端口绑定的公共端口。 |
docker-compose ps | 列出容器列表 |
docker-compose pull | 拉取服务镜像 |
docker-compose push | 推送服务镜像 |
docker-compose restart | 重启服务容器 |
docker-compose rm | 移除已停止的服务容器 |
docker-compose run | 在服务上运行一次性命令。 |
docker-compose start | 开始服务查看docker service ps task: non-zero exit (1) |
docker-compose stop | 停止服务 |
docker-compose top | 显示正在运行的进程 |
docker-compose unpause | 取消暂停的服务 |
docker-compose up | 创建并启动容器 |
docker-compose version | 显示Docker Compose的版本信息 |
栈列表
docker stack ls
节点列表
docker-node ls
服务列表
docker sevice ls
显示执行内容
docker service ps
显示完整内容(不截断)
docker service ps –no-trunc
查看service某个镜像中详情
docker service inspect –pretty doctek_doctek-app
创建服务
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Options
1、--detach , -d: 指定容器运行于前台还是后台,默认为false
2、--name: 服务名称
3、--network: 网络连接
4、--publish , -p: 端口映射
5、--env , -e: 设置环境变量
6、--tty , -t: 分配tty设备,该可以支持终端登录
7、--mount: 文件挂载
8、--replicas: 指定任务数量
eg:
docker service create --replicas 3 -p 8080:80 --name api_131 \
--mount type=bind,source=/storage/apiapp_log,destination=/go/src/logs \
-e RUN_MODE=Production \
-t registry.youkeshu.com:5000/nginx:php7.1v3
docker-compose up 与 docker stack deploy 区别
Docker Stack命令
1) docker stack deploy
用于根据 Stack 文件(通常是 docker-stack.yml)部署和更新 Stack 服务的命令。
2) docker stack ls
会列出 Swarm 集群中的全部 Stack,包括每个 Stack 拥有多少服务。
3) docker stack ps [服务名]
列出某个已经部署的 Stack 相关详情。该命令支持 Stack 名称作为其主要参数,列举了服务副本在节点的分布情况,以及期望状态和当前状态。
4) docker stack rm
命令用于从 Swarm 集群中移除 Stack。移除操作执行前并不会进行二次确认
1.查看集群节点信息
docker node ls
2.添加标签
docker node update --label-add role=cluster0001 ejxxvy9qx71uh4cs7twgczaui(nodeid)
3.查看是否添加成功,查看 Spec下面是否有添加的
docker node inspect ejxxvy9qx71uh4cs7twgczaui
4.删除标签
docker node update --label-rm role ejxxvy9qx71uh4cs7twgczaui
5.约束方式
1.
docker service create \
--name nginx_test \
--constraint 'node.labels.role == cluster001' \
nginx
2.
deploy:
placement:
constraints: [node.labels.role==cluster0001] # 条件约束
- docker-compose 多个容器编排
- docker-machine 命令行工具 远程操作docker
- docker-swarm 集群
#docker-machine 链接主机
# 1. 连接虚拟机
docker-machine create --driver=virtualbox test
#查看访问所创建 Docker 环境所需要的配置信息
docker-machine env test
# 2.连接本地主机, 配置好ssh免密后连接另外一台装有docker的机器, ip: 101.132.157.**, user用户登录, 起名为 mst1
docker-machine create -d generic --generic-ip-address=101.132.157.** --generic-ssh-user=root mst1
# 3.链接云驱动, 连接一些云平台的机器
docker-machine create --driver amazonec2 --amazonec2-access-key AKI******* --amazonec2-secret-key 8T93C********* --amazonec2-vpc-id vpc-****** aws_instance
docker-machine ls:查看docker-machine管理的Dockerized主机
docker-machine rm –f Dockerized:删除指定的Dockerized主机
docker-machine env Dockerized:查看指定的Dockerized主机环境变量
docker-machine upgrate docker1 docker2:批量更新docker host版本
docker-machine config docker1:查看host的docker daemon配置
docker-machine start/status/restart/kill:对docker host所在的系统的操作
docker-machine scp:docker host之间复制
docker-machine use machine-name:激活docker化主机
docker-machine ip machine-name:显示的主机的IP地址
管理节点与工作节点可以使用内网地址与外网地址,将192.168.1.200这台服务器初始化为管理节点,切换到200这台服务器。使用内网地址初始化节点:
docker swarm init –advertise-addr 192.168.1.200 或者 docker swarm init –advertise-addr 192.168.1.200 –listen-addr 192.168.1.200:2377
查看集群节点情况
docker node ls
查看加入为swarm manager的token
docker swarm join-token manager
docker swarm join-token worker
脱离集群
docker swarm leave
集群master删除slave
id是 docker node ls里面的id
docker node rm
查看原有网络
docker network ls
本机启动:
docker stack deploy -c docker-compose.yml [创建的服务名字]
部署到 swarm
https://cloud.tencent.com/developer/ask/sof/1934508
$ docker-machine scp docker-compose.yml manager:~/
$ docker-machine ssh manager docker stack deploy --compose-file=docker-compose.yml example
或者
docker-machine ssh manager docker stack deploy -c - example < docker-compose.yml
docker-machine 常用命令
命令 | 说明 |
---|---|
docker-machine create | 创建一个 Docker 主机(常用-d virtualbox ) |
docker-machine ls | 查看所有的 Docker 主机 |
docker-machine ssh | SSH 到主机上执行命令 |
docker-machine env | 显示连接到某个主机需要的环境变量 |
docker-machine inspect | 输出主机更多信息 |
docker-machine kill | 停止某个主机 |
docker-machine restart | 重启某台主机 |
docker-machine rm | 删除某台主机 |
docker-machine scp | 在主机之间复制文件 |
docker-machine start | 启动一个主机 |
docker-machine status | 查看主机状态 |
docker-machine stop | 停止一个主机 |
docker swarm 常用命令
命令 | 说明 |
---|---|
docker swarm init | 初始化集群 |
docker swarm join-token worker | 查看工作节点的 token |
docker swarm join-token manager | 查看管理节点的 token |
docker swarm join | 加入集群中 |
docker node 常用命令
命令 | 说明 |
---|---|
docker node ls | 查看所有集群节点 |
docker node rm | 删除某个节点(-f 强制删除) |
docker node inspect | 查看节点详情 |
docker node demote | 节点降级,由管理节点降级为工作节点 |
docker node promote | 节点升级,由工作节点升级为管理节点 |
docker node update | 更新节点 |
docker node ps | 查看节点中的 Task 任务 |
docker service 常用命令
命令 | 说明 |
---|---|
docker service create | 部署服务 |
docker service inspect | 查看服务详情 |
docker service logs | 产看某个服务日志 |
docker service ls | 查看所有服务详情 |
docker service rm | 删除某个服务(-f 强制删除) |
docker service scale | 设置某个服务个数 eg: docker service scale nginx=0 |
docker service update | 更新某个服务 |
docker stack 常用命令
命令 | 说明 |
---|---|
docker stack deploy | 部署新的堆栈或更新现有堆栈 |
docker stack ls | 列出现有堆栈 |
docker stack ps | 列出堆栈中的任务 |
docker stack rm | 删除堆栈 |
docker stack services | 列出堆栈中的服务 |
docker stack down | 移除某个堆栈(不会删除数据) |
安装k8s
-
apt-get 翻墙安装
新建翻墙配置文件,内容为下面三行: Acquire::http::proxy "http://ip:端口/" Acquire::ftp::proxy "ftp://ip:端口/" Acquire::https::proxy "https://ip:端口/" apt-get -c 文件名(翻墙代理如果需要) install -y xxxx
# 更新安装器
apt-get install update
# 使得 apt 支持 ssl 传输
apt-get install apt-transport-https
# 如报错不能安装则重装apt-get(错误提示:The package lists or status file could not be parsed or opened.)
# sudo rm -vf /var/lib/apt/lists/*
# sudo apt-get update
# 设置linux代理命令,echo $http_proxy 验证成功与否(需要科学上网)
# export http_proxy=192.168.*.*:1087 && export https_proxy =http_proxy=192.168.*.*:1087
# 安装命令
apt-get install -y kubelet kubeadm kubectl
# 禁止命令更新: apt-mark hold kubelet kubeadm kubectl
k8s master初始化
禁用虚拟内存
-
方式1(重启后消失)
swapoff -a
-
方式2,编辑/etc/fstab 配置,注释第二行文件,然后重启
sudo vi /etc/fstab ###编辑/etc/fstab 配置,注释第二行文件 UUID=e2048966-750b-4795-a9a2-7b477d6681bf / ext4 errors=remount-ro 0 1 # /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 #重启 reboot
k8s master初始化
#禁用虚拟内存
swapoff -a
#初始化
# 某些版本如果cpu小于一核会初始化失败,添加后面参数避免验证失败 --ignore-preflight-errors=NumCPU
kubeadmin init --pod-network-cidr=xxxxxxx/xx --ignore-preflight-errors=NumCPU
#
kubeadm init \
--apiserver-advertise-address=192.168.56.11(master节点的服务器ip) \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16
# 检查node是不是ready状态
kubectl get node
# 检查所有pod是不是正常
kubectl get po --all-namespace -o wide
# 如果pod不是running状态,则查看该pod: kubectl describe pod xxxx -n kube-system ,可能是镜像无法下载导致,如果是手动再node上pullimage
# 然后在master上删除对应的pod, k8s会自动重新调度
# 删除命令: kubectl delete pod xxx -n kube-system
-
设置一台服务器到另一台服务器免密登录
# 生产密钥和公钥 (默认名字是id_rsa和id_rsa.pub) ssh-keygen -t rsa # 将公钥发送到另一台服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub root@otherip #验证,不用输入密码能登录代表好了 ssh root@otherip
-
查看k8s运行的应用
kubectl get services –all-namespaces
-
配置脚本
#### deploy_docker.sh #!/bin/sh #maven01 $workspace $jarname # ${projectName} ${docker_path} ${jarName} set -e projectName=$1 docker_path=$2 appName=$3 #user_name = #password= tag=$(data +%s) # 镜像仓库地址 server_path=192.168.22.22:5000 target_image=${projectName}:${tag} #${BUILD_NUMBER} echo ${target_image} cd ${docker_path} # 构建docker镜像 docker build --build-arg app=${appName } -t ${target_image } . # 镜像打tag docker tag ${target_image } ${server_path}/${projectName} echo The name of image is "${server_path}\/${target_image}" #推送镜像到仓库 docker push ${server_path}/${projectName}:latest # 删除镜像 docker rmi -f $(docker images | grep ${projectName} | grep {tag} | awk '{print $3}' | head -n 1)
-
运行命令
# 运行应用 kubectl apply -f kube.yaml # 查看所有运行的service kubel get sevices --all-namespace
cd ${WORKSPACE}/Doctek-docker
chomd 777 ./copy.sh
mv docker-compose.yml docker-compose_old.yml
cp docker-compose-dev.yml docker-compose.yml
docker-compose build
docker
jenkins+ docker+kubernates
-
jenkins 打包出jar文件
-
执行shell 生成新的镜像推送到镜像服务器
#!/bin/sh jarName=xxxx.jar jarFolder=xx projectName=xx docker_path=${WORKSPACE} cp ${WORKSPACE}/target/${jarName} ${docker_path} # 执行镜像打包命令,命令内容上面有 sh /root/docker_dir/deploy_docker.sh ${projectName} ${docker_path} ${jarName}
-
再执行shell, 将yaml配置文件拷贝到k8s master 上面运行应用
set -e echo ok echo ${WORKSPACE } docker_path=${WORKSPACE } # 将k8s的yaml配置文件拷贝过去 scp ${WORKSPACE}/*.yaml k8smasterhostip:/root/ # 远程执行命令部署k8s应用 ssh k8smasterhostip '/opt/bin/kubectl apply -f /root/kube.yaml' ssh k8smasterhostip '/opt/bin/kubectl get svc|grep maven'
-
-
编译后执行docker打包成镜像命令
-
打包后推送镜像