docker基本使用和遇到的各种问题总结
参考中文文档
- 参考添加链接描述
安装docker (hypervisor虚拟化系统)
- 1.官方脚本安装
curl -fsSL https://get.docker.com | sh
systemctl start docker
systemctl enable docker 加入开机启动
-
- yum源安装
- 阿里云的代理
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11ypk1M9
cat > /etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg EOF
yum install docker
-
- 下载方式安装
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载需要的版本 本地安装
docker-ce-17.03
docker-ce-selinux-17.03
yum -y install *
-
- 直接从阿里云安装
参考 https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11lCPwMu
yum install -y yum-utils device-mapper-persistent-data lvm2 # docker 依赖
# 阿里云代理
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y && yum install -y docker-ce
systemctl start docker
systemctl enable docker 加入开机启动
## 创建 /etc/docker 目录mkdir /etc/docker
# 配置 daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file","log-opts": {"max-size": "100m" }
}
EOF
mkdir-p /etc/systemd/system/docker.service.d
# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docke
基本环境需要
- centos 7
- 关闭防火墙
- 安装iptables
`yum -y install iptables-services`
systemctl start iptables
systemctl enable iptables // 开机自起
iptables -F 清空默认规则
service iptables save 保存默认规则
容器基本操作
容器和主机双向复制文件
- to docker
docker cp a.txt 30026605dcfe:/root
- docker to
docker cp 30026605dcfe:/root/a.txt /tmp/
容器内显示中文问题
- locale -a
- vim /etc/profile
- 将export LANG="C.UTF-8"加到最后一行
- source /etc/profile
新建一个容器
docker run --name liuqt -t -i -d ubuntu:14.04 /bin/bash
- 参数说明
- t -t 则让容器的标准输入保持打开
- i -i 则让容器的标准输入保持打开
- d 以守护态Daemon形式运行,后台运行
- –name 自定义命名 liuqt
- –restart=always // 随着容器的启动而启动
- –add-host hostname:IP
- www.baidu.com:127.0.0.1 // 加入到hosts
查看容器列表
- docker ps -a --no-trunc // --no-trunc 显示长id
查看容器详情
- docker inspect ID/NAMES
删除容器
- docker rm NAMES/ID
- docker rm -f NAMES/ID // 删除正在运行的容器
- docker rm -f $( docker ps -a -q ) 批量删除 // -q 只显示id号
查看容器的日志
- docker logs NAMES/ID
- docker logs -f -t --tail 100 container
查看容器的top
- docker stats [NAMES/ID]
进入容器
- docker attach [id]
- docker exec id [command] 非交互式
- docker exec -ti id 交互式/ctrl+pq 退出
和主机绑定
- docker run -it -p 8192:8192 ubuntu/v2 /bin/bash
- –net=host
导出和导入容器
- 导出1
docker export 7691a814370e > ubuntu.tar
- 导入1
docker import - test/ubuntu:v1.0
- 导出2
docker save -o xxx.tar unutu:v3
- 导入2
dokcer load -i xxx.tar
- 导出3 导出正在运行的容器为镜像
docker commit id tag:1.0
容器互联
–link 方式
docker run --link可以用来链接2个容器,使得
源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,
例如:
docker run -d --name selenium_hub selenium/hub
docker run -d --name node --link selenium_hub:hub selenium/node-chrome-debug
--link的格式
--link <name or id>:alias
其中,name和id是源容器的name和id,alias是源容器在link下的别名。
会在/etc/hosts写入规则
源容器和接收容器之间传递数据是通过以下2种方式
1. 设置环境变量(env | grep -i alias)
1.1docker会在接收容器中设置名为<alias>_NAME的环境变量,
该环境变量的值为:<alias>_NAME=/接收容器名/源容器alias
例如: node容器下面 HUB_NAME=/node/hub
1.2 docker还会在接收容器中创建关于源容器暴露的端口号的环境变量
<name>PORT<port>_<protocol>
<name>表示链接的源容器alias
<port>是源容器暴露的端口号
<protocol>是通信协议:TCP or UDP
例如 node容器中 HUB_PORT_4444_TCP_PROTO
1.3 docker还在接收容器中创建1个名为<alias>_PORT的环境变量,
值为源容器的URL:源容器暴露的端口号中最小的那个端口号。
例如:node容器中 HUB_PORT=tcp://172.17.0.2:4444
1.5官方建议使用/etc/hosts来解决重启环境变量失效的问题
2. 更新/etc/hosts文件
docker会将源容器的host更新到目标容器的/etc/hosts
创建新的网桥模式 (建议采用这种)
// 自定义bridge网络
docker network create link-network
docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" link-network
// redis
docker run -d --network link-network --network-alias redis redis:latest
// mysql
docker run -d --network link-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
// app
docker run -it --network link-network magic:v1 /bin/bash
// app配置文件通信方式 mysql redis 使用的是内置dns通信
mysql = root:123456@(mysql)/magic-garden?parseTime=True&loc=Local
redis = redis:6379
dockerfile
网易蜂巢镜像仓库
- library/centos 没有运行在前台的demon docker会将这个容器直接退出
- public/centos 7-7.6
- https://c.163yun.com/dashboard?nowLang=zh#/ccr/list
- https://c.163.com/hub#/home 仓库
- https://c.163yun.com/hub#/home
定制镜像
// 打包成镜像
docker commit ID/NAME xxx:1.0 // 备份 不会将里面的启动项保存
dockerfile构建
docker build -t liuqt:v1.0 . // -t 打上标签 当前目录需要有DockerFile
修改镜像标签
docker tag NAME:tag 自建仓库地址:8888/NAME:1.0
- // docker tag 原来名字:标签 新的名字:标签
docker image tag b6b7e4d1eb8e pentest-tools:v1
自定义时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
自建docker私有仓库
官方 registry
服务端
1. docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry
// registry 使用的是官方镜像
// // 官方默认是443 需要手动加上对5000的认证
2. 在该台机器上执行 vim /etc/docker/demon.json
添加 {"insecure-registries":["上面仓库的ip:5000"]}
systemctl restart docker
客户端
1. 打包上传
docker tag NAME:tag 自建仓库地址:5000/NAME:1.0 // 修改标签
docker push 自建仓库地址:5000/NAME:1.0 //上传
curl -XGET http://自建仓库地址:5000/v2/_atalog // 查看镜像列表
2. 该台机器同样需要上面的认证
三方 harbor
docker网络通讯
docker inspect ID/NAMES 查看配置信息
容器与容器
- 通过docker0 网桥通信
- 默认 172.17.0.1 当作其它容器的网管
容器访问外部网络
- snat
外部访问容器
- dnat
容器网络模式修改
docker run --name mysql11 --net=xxx -d mysql:5.7
--net 指定容器的网络模式
bridge // 默认模式
-p 暴露端口
-p <HostPort>:<ContainerPort>
-p <IP>:<HostPort>:<ContainerPort>
none // 没有网络模式 比如说用来做计算的容器
container // 容器会加入到其它容器的 network namespace
host // 容器使用Host的网络,没有自己独立的网络栈,端口直接暴露出去,不安全
容器网络隔离
-
使用不同的网桥
- dokcer network ls 查看可用的网络类型
- docker network create -d 类型 网络空间名称
docker network create -d bridge n1
- docker run --name mysql11 --network=n1 -d mysql:5.7
docker network create -d bridge n2
- docker run --name mysql22 --network=n2 -d mysql:5.7
- 上面两个容器是不能通信的,使用的不是同一个网桥
-
想让隔离的容器可以通信
- 创建真实的网桥
数据存储
数据卷特性
- 写时复制
1.容器自管理卷(使用主机的目录)
- 默认会在 /var/lib/docker/volumes/ 创建一些目录 用于保存数据
- 自定义
- Dockerfile 中指定volumes
- 例如: VOLUME /data
- 删除容器时候也想把数据卷删除
- docker rm -f -v ID/NAME
2.自绑定卷
- 容器没有自管理卷
将主机的/data/mysql 目录 与容器/绑定 -v可以加多个
docker run --name mysql11 -v /data/mysql/:/ -d mysql:5.7
docker run --name mysql22 -v /data/mysql/:/ -d mysql:5.7
- 两个容器共享主机某个目录
- 借助了主机的目录
3.联合卷
- 2中的目录共享 同时不借助主机的某个目录
- 镜像中必须有 volumes
- docker run --name mysql2 -d --volumes-from mysql1 mysql:5.7
资源限制
压力测试实验
// 限制内存在256m
docker run --name stress -it --rm -m 256 mlorel/docker-stress-ng:lateststress -vm2
// 限制使用n核cpu // 😄用48核cpu的服务器跑了30核😄
docker run --name stress -it --rm lorel/docker-stress-ng:latest --cpu 30
// 限制使用0号cpu
docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:lateststress --cpu8
mysql 5.7
- centos手动安装
yum install mysql mysql-server
service mysqld start
chkconfig mysqld on
mysqladmin -u root password 123456
- 容器安装
docker search mysql
第一个
docker pull mysql:5.7 // mysql 5.7版本
docker run --name mysql_docker -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Liuqt12345678**__QQ -p 3306:3306 -d mysql:5.7
--name 起个名字
-e 注入环境变量
--restart always
-v 持久化存储
导出所有表
$ docker exec mysql_docker sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
导入sql
docker exec -i mysql_docker sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
通信
docker run --name mywordpress --link mysql_docker:mysql -p 3306:3306 -d wordpress
参考 :https://blog.csdn.net/belvine/article/details/89553972