docker基本使用和遇到的各种问题总结

参考中文文档

安装docker (hypervisor虚拟化系统)

  • 1.官方脚本安装
curl -fsSL https://get.docker.com | sh
systemctl start docker
systemctl enable docker  加入开机启动
    1. 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
    1. 下载方式安装
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载需要的版本 本地安装
docker-ce-17.03
docker-ce-selinux-17.03
yum -y install *
    1. 直接从阿里云安装
参考 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

docker-compose

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值