title: Docker
date: 2018-12-15 11:24:44
tags:
- 基础
categories:
- Docker
💠
💠 2024-06-26 15:40:27
Official Doc | docker-cn
Docker中国
Docker 是一个开源的应用容器引擎
理解为轻量版虚拟机(不模拟硬件层)
线上练习Docker环境
镜像瘦身
17.05+
Official doc
所有的发行版
docker.io 是旧版本 现在新的Docker分为 docker-ce docker-ee
注意 Deepin上 如果通过 apt 去安装 docker-compose 它会把 docker-ce 卸掉, 装旧的 docker.io
这两种方式装的是同一个版本号
sudo dpkg -i deb文件
sudo docker run hello-world
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo apt install docker-ce
snap
sudo apt install snapd
snap install find
snap install docker
sudo echo "deb http://http.debian.net/debian jessie-backports main" >> /etc/apt/sources.list
sudo apt-get install docker-ce
前置软件
sudo apt-get install sudo yum install docker
service docker start
设置开机启动: chkconfig docker on
pacman -S docker
Windows上本质是用了VirtualBox创建虚拟机来跑Docker, 屎一般的体验, 然而Win10的WSL因为不能模拟aufs 以及 cgroup 所以能装不能用
只能装上docker for windows 然后把Docker守护进程的套接字文件配置给wsl用。。。。。
docker run hello-world
有正常输出即可docker volume create portainer_data
docker run --name portainer -d -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
docker 所有的数据默认存储在
/var/lib/docker
ctop
Top-like interface for container metrics
2024-06-06 开始封禁Dockerhub及国内源,所以最稳妥的还是用代理
设置代理方式
[Service]
Environment="HTTP_PROXY=http://localhost:7890"
Environment="HTTPS_PROXY=http://localhost:7890"
# 可选项,配置不走代理的仓库
Environment="NO_PROXY=your-registry.com,10.10.10.10,*.example.com"
默认的DockerHub因为在国外所以网络不太稳定,需要使用国内镜像源
三种使用的方式
docker pull registry.docker-cn.com/myname/myrepo:mytag
docker --registry-mirror=https://registry.docker-cn.com daemon
/etc/docker/daemon.json
文件, 永久性更改 {"registry-mirrors": ["https://registry.docker-cn.com"]}
时速云
sudo docker pull index.tenxcloud.com/<namespace>/<repository>:<tag>
docker tag index.tenxcloud.com/docker_library/node:lastest node:lastest
v1
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
docker tag 镜像 ip:port/镜像名
curl http://IP:5000/v1/search
v2
docker run -d -p 5000:5000 --name registry registry:2
curl IP:5000/v2/_catalog
注意 由于 docker client 默认是用的 HTTPS 方式通信, 但是这个本地的 registry 默认是 HTTP 的, 所以有几种解决方案
DOCKER_OPTS="--insecure-registry ip:port"
{ "insecure-registries":["IP:PORT"] }
直接运行 docker, 就会有命令的使用提示 例如查看docker版本
docker version
登录镜像仓库
登录hub.docker :docker login
或者 docker login -u username -p password
登录时速云:sudo docker login index.tenxcloud.com
登录百度云: docker login --username=[username] hub.baidubce.com
清理全部未使用的资源 docker system prune -a
Docker 的镜像是采用分层文件系统, Dockerfile中每个RUN命令造成的修改或新增都是新的一层layer,旧文件不变
dive
查看镜像内各layer文件
docker images
docker search 镜像名
docker pull 镜像名
docker rmi 镜像名
docker inspect [-f {{".Architesture"}}]
-f 查看JSON格式的具体节点的数据值docker history imagename
docker tag originname newname
docker save -o ubuntu.tar ubuntu:14.04
docker load --input ubuntu.tar
或 docker load < ubuntu.tar
docker push mythos/test:lastest
docker image prune --all
查看所有容器的状态:docker stats
能看到正在运行的容器内存 cpu io net等信息
-a
所有容器--no-stream
不阻塞标准输出流,只输出一次信息停止容器:docker stop 容器name
重启容器:docker restart 容器name
启动容器:docker start 容器name
删除容器:docker rm 容器name
-f
强行停止正在运行的容器并删除-l
删除容器的连接,但是保留容器-v
删除容器挂载的数据卷docker rm ${docker -a -q}
docker system prune --volumes -f
容器日志(终端所有输入输出):docker logs 容器name或id
重命名 : docker rename origin new
导入导出 (容器快照):
docker export -o test.tar 容器名
docker export 容器name > test.tar
docker import [-c |--change=[]] [-m | --message=[]] file|URL - [repository]:[tag]
修改端口映射
PortBindings
节点 新增或修改"PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"3360"}]}
NetworkSettings.Ports
节点下 新增或修改"Ports":{"8080/tcp":[{"HostIp":"0.0.0.0","HostPort":"8888"}],"8081/tcp":[{"HostIp":"0.0.0.0","HostPort":"8881"}]}
docker ps
docker ps -a
docker ps -s
.ID Container ID
.Image Image ID
.Command Quoted command
.CreatedAt Time when the container was created.
.RunningFor Elapsed time since the container was started.
.Ports Exposed ports.
.Status Container status.
.Size Container disk size.
.Names Container names.
.Labels All labels assigned to the container.
.Label Value of a specific label for this container. For example '{{.Label "com.docker.swarm.cpu"}}'
.Mounts Names of the volumes mounted in this container.
.Networks Names of the networks attached to this container.
Docker run 命令的使用方法 等价于 docker create 再 docker start
docker run -d --name conrainer-name image-name touch a.md
,如果镜像本地没有会自动pull
--name
配置容器名字-d
后台启动程序-i
交互模式运行容器(标准输入和标准输出) docker run -it ubuntu /bin/bash
-t
容器启动后进入其命令行-v
将本地文件夹建立映射到容器内 -v 本机:容器
-p
端口映射左本机右容器:-p 44:22
, 主机容器端口相同:-p 22
-P
-p 44:22/udp
--env name="tanky"
设置环境变量--cpu-shares
设置CPU的相对权重,只在link之间容器的权重比例--cpuset-cpus
限制只能运行在某标号的CPU上--user
-u 限制用户--cap-drop
去除能力--link
链接其他容器--rm
容器运行结束退出就自动删除该容器 注意和-d
不能共存--restart=always
设置该容器随dokcer 服务自启动--hostname hostname
指定容器的 hostname--init
能增加 docker-init 进程作为1号进程 entrypoint 或 cmd 中的命令成为docker-init 子进程-e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro
内存限制
--memory 100M
或者 -m 100M
--memory-swap -1
登录容器:
docker exec -it 容器name或id bash
docker attach 容器id
这个命令虽然简单,但是退出会话就自动关闭了容器这些选项不加就是默认值,加上短参数形式就是设为另一个值 如 -t
-i
,--interactive=ture|false
打开标准输入接受用户输入命令--privileged=true|false
是否给以最高权限-t
,--tty=true|false
是否分配伪终端-u
,--user=""
执行命令的用户或ID使用 nsenter 连接到容器:
docker commit 容器id 镜像name
将容器为id的当前容器 保存为name镜像查看容器的端口映射情况, 输出是左容器右本机, 和使用相反
-P
或 -p
参数来开放
IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort
IP:HostPort:ContainerPort
IP::ContainerPort
HostPort:ContainerPort
docker run -d -p 127.0.0.1::5000/udp ubuntu apt update
docker port ubuntu17 5000
docker inspect 容器id
Ubuntu/Debian默认
CentOS/RedHat默认
数据卷是一个可供容器使用的特殊目录,它将宿主机操作系统目录映射进容器 类似于 mount操作
docker run -v dir:dir[:ro]
一般是创建容器时使用,和-p类似可以多个,左本机右容器 默认rw权限可以指定 ro只读
挂载宿主机时区及时间 /etc/localtime:/etc/localtime
docker run -it -v /test --name data ubuntu
运行一个挂载了数据卷的容器docker run -it --volumes-from data --name db1 ubuntu
docker run -it --volumes-from db1 --name db2 ubuntu
--volumes-from
参数所挂载数据卷的容器并不需要保持在运行状态docker rm -v
来声明删除容器并删除关联的数据卷利用数据卷容器来迁移数据
docker run --volumes-from data -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /data
docker run -v /data --name reuse ubuntu /bin/bash
docker run --volumes-from reuse -v $(pwd):/backup busybox tar xvf /backup/backup.tar
声明式环境,管理多容器, 并处理好相关资源的关系
sudo pip install docker-compose
一个配置文件就表示了一组容器, 以及相关的网络,文件等配置, docker-compose 都是基于该配置文件进行基本命令操作
语法上和 docker run 基本一致, 只不过以 yml 形式配置而已
声明一个 xxx 网络 供 service 使用
networks:
xxx:
external: false
driver: bridge
ipam:
driver: default
config:
- subnet: 10.12.0.0/16
version: "2.1"
services:
zookeeper:
image: ${IMAGE_NAME:-defaultImage}
expose:
- "6666"
ports:
- "6666:6666"
volumes:
- /etc/localtime:/etc/localtime
networks: # 可不配置,Docker会默认分配一个ip 172.xx 开头
- xxx
command: ./bin/start.sh
links:
- "mysql:mysql"
environment:
- NAME=who
必须要在 docker-compose.yml 文件目录下执行
创建
服务,启动服务,并关联服务等操作, -d
后台执行删除
该服务的所有容器, 移除网络, -v
移除挂载的volumeyml所在的目录名会作为容器名的前缀
创建一个docker集群环境 官方文档安装
Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory"
Official Doc 分为 none host brige(缺省) user-defined 几种类型
Connection reset by peer
docker network inspect bridge
对比 netstat -nr
查看
原因待寻找
/etc/docker/daemon.json 顶级元素加入如下配置网段
"default-address-pools":[
{"scope":"local","base":"172.80.0.0/16","size":24},
{"scope":"global","base":"172.90.0.0/16","size":24}
docker run -it --network none busybox
docker run -it --network host busybox
安装 Docker 的时候, 都会创建一个 docker0 的网桥 Linux bridge
--network
或者使用 --network default
创建容器 都会默认挂载到 docker0 上docker network inspect bridge
命令可以看到子网掩码是 172.17.0.0/16
网关是 172.17.0.1
注意: 此方式下容器之间是互通的, 通常使用的
--link containerName:aliasName
也只不过是在 /etc/hosts 文件中添加了容器的 dns 而已
特别容易出现锁,一个没有启动,其他的都启动不了 尝试?
sudo service docker restart
创建一个MySQL容器供一个Ubuntu容器使用
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=ad -d mysql
docker run -d --name test --link mysql2:db ubuntu
--link name:alias
在父容器中会将该映射加入host文件,所以无需找ip,直接使用别名mysql -h db -u root -pad
即可连接上mysql
cat /etc/hosts
中myslq容器别名为db值的IP地址ping db
apt install inetutils-ping
ifconfig就要安装net-tools
创建一个Nginx和一个Springboot搭建的web服务
docker run --name test-nginx -d -p 80:80 -v /home/kuang/nginx/conf/:/etc/nginx/conf.d/:ro --link you:web nginx
一样的cat /etc/hosts 查看容器的IP
, 其实最简单就是用link配置时的别名即可,因为Docker已经帮我们配置好了host。。。 upstream backend {
server 172.17.0.4:8888;
}
server {
listen 80;
server_name backend;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxt true;
proxy_pass http://backend;
proxy_redirect off;
}
}
weave
能解决跨宿主机的容器互联问题
Docker 提供三种 网络驱动 bridge overlay macvlan, 后两者可用于跨主机的容器通信
容器分配独立ip
docker network create --subnet=172.13.0.0/24 test-standby
docker run -it --net test-standby --ip 172.13.0.8 -p 6379 --name redis-stand redis:5.0.9-alpine
sysctl -w net.ipv4.ip_forward=1
route add 172.13.0.0 mask 255.255.255.0 192.168.7.110
ip route add 172.13.0.0/24 via 192.168.7.110
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。