docker 基础

混江龙づ霸主 提交于 2019-11-28 23:08:52

docker

# 容器: 在隔离环境中运行的一个进程,进程停止,容器销毁(打包软件的容器)
-- 隔离的环境拥有自己的系统文件,ip地址,主机名等
-- 程序: 代码或命令
-- 进程: 运行的程序
# 容器和虚拟化的区别
-- kvm 虚拟化: 需要硬件的支持,需要模拟硬件,可云翔在不同的操作系统
-- kvm 模拟硬盘(写数据先写在自己,然后宿主机)
-- 可以
# linux 开机启动流程:
bios 开机硬件自检
根据bios设置的优先启动项boot 网卡, 硬件,u盘 , 光驱
读取mbr引导  UEFI(gpt分区) mbr硬盘分区信息,内核加载路径
加载内核
启动一个进程 init systemd
系统初始化完成
运行服务
# 容器的启动流程  --- 直接使用宿主机的硬件
共用宿主机的内核
启动第一个进程,直接启动服务
-- 优点: 损耗少,启动快,性能高
-- 缺点: 只能运行linux(windows 起虚拟机,然后运行docker)
# 容器发展历程
chroot技术:新建一个子系统

安装docker

网址: https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
docker version 用来查看docker 版本
# docker 官方仓库地址
1. 官方仓库: https://hub.docker.com/
2. 私有仓库: daocloud
-- docker 是一种软件的打包技术
-- 构建: 做一个docker 镜像
-- 运输: docker pull
-- 运行: 启动一个容器
-- 每一个容器,都有自己的系统rootfs
# docker主要组成部分
-- cs 架构,分为docker client and docker server
-- 主要组件: 镜像,容器,仓库,网络,存储
-- 启动容器必须有一个镜像,仓库中只存镜像
-- 容器 -- 镜像 -- 仓库
# 命令总结
docker version
systemctl start docker  # 启动服务端
systemctl enable docker
docker info  # 如果要做监控

docker 使用

# 配置docker 镜像加速
vi /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}
systemctl restart docker
# 启动一个nginx 的容器
docker run -d -p 80:80 nginx
run 创建并运行一个容器
-d 放在后台
-p 端口映射  宿主机:容器
nginx  docker镜像的名字
# 镜像 (在docker hug注册账号可以自己上传镜像)
# 搜索镜像  
docker search tomcat  
选择镜像: stars 多的
# 拉镜像  (官方仓库和私有仓库都可以)
docker pull 搜出来的镜像名
docker pull alpine  /  docker pull alpine:3.6
dockerhub 搜索alpine 可以获得版本
# 镜像有关的所有命令查看
docker image
docker image ls   查看镜像列表or  docker images
# 导出镜像
docker image save alpine:latest -o docker_alpine.tar.gz
# 删除镜像
docker image rm alpine
# 导入镜像
docker image load -i docker_alpine.tar.gz
# 镜像改名
docker image tag 镜像id oldboy:v1  

docker的容器管理

# 启动容器 
docker run -d -p 80:80 nginx:latest
docker run -it --name centos6 centos:6.9 /bin/bash
--it  分配交互式的终端
-- name 指定容器的名字
/bin/bash 覆盖容器的初始命令
'''
docker run image_name
docker run -it image_name  CMD
docker run ==== docker create + docker start
'''
# 查看容器列表
docker container ls
docker container ls -a
docker ps 
docker ps -a
docker ps -a -q 静默输出,只输出容器的id
docker ps -a -l  last查看最近启动的容器
docker ps -a -l --no-trunc  显示详细
# 停止容器
docker container stop 容器ID
docker container kill 容器ID或名字
# 启动容器
docker container start 容器名
# 进入容器(目的,调试,排错)
doceker exec options container command 
-- docker exec -it 容器id或名字 /bin/bash
docker attach  # 多个xshell 窗口用同一个终端
-- docker attach options container #用的少

# 退回宿主机 (临时回宿主机)
ctrl + p  ctrl + q
# 再返回容器,保存刚才对容器的操作
docker attach 容器id
# 删除容器
docker container rm 容器id
docker rm 容器id
docker rm `docker ps -a -q`  批量删除容器
docker rm -f `docker ps -a -q`   -f 强制删除
# 启动一个命令,一直活着
docker run -d centos:6.9 tail -f /etc/hosts

# 检查容器状态
systemctl status docker
'''
总结: docker 容器内的第一个进程(初始命令)必须一直处于前台运行的状态,否则这个容器刚启动就退出了
业务中的容器:夯住,启动服务
'''

容器的网络访问

1. yum install httpd -y
2. service httpd start 
3. netstat -lntup  # 查看是否监听80端口
4. 可以加端口映射
iptables -t nat -A PREDOUTING -d 10.0.0.12 -p tcp --dport 80 -j DNAT --to-destination 172.7.3.0:80
iptables -t nat -I PREDOUTING -d 10.0.0.12 -p tcp --dport 80 -j DNAT --to-destination 172.7.3.0:80
iptables -t nat -L -n 查看
# 为避免以上操作,加 -p参数
docker run -d -p 81:80 nginx:latest
# 端口映射依赖内核转换参数
sysctl -a|grep ipv4|grep forward
docker 一启动,net.ipv4.ip_forward=1  是否能上网的参数
如果虚拟机挂起再恢复,那么上面值会变为0
# 指定映射(docker 会自动添加一条iptabelse 规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort  # 多个容器都想使用80端口
-p ip::containerPort  # 省略宿主机端口,起了一个随机端口 
随机的端口根据内核参数决定的
sysctl -a|grep net.ipv4|grep 'rang'   # 随机端口范围
-p hostPort:containerPort:udp
-p 81:80 -p 443:443  可指定多个 -p  做多个端口映射
 

容器的数据卷挂载

#修改首页页面
# opt下的bird 映射到/usr/share/nginx/html 目录
docker run -d -p 80:80 -v /opt/bird:/usr/sare/nginx/html nginx:latest
wget http://192.168.15.84/xiaoniaofeifei.zip
unzip xiaoniaofeifei.zip
方法二
docker run -d -p 81:80 -v  octivia:/usr/share/nginx/html nginx:latest
-v 创建了一个卷
docker volume inspect octivia 查看

基于nginx启动一个容器,监听80和81,访问80,出现nginx 默认欢迎首页,访问81出现小鸟
-p 80:80  -p 81:81 -v
基于nginx 多端口的多站点
# 进入容器中手动配置配置文件
docker run -it -p 80:80 -p 81:81 -v /opt/bird:/data nginx:latest /bin/bash
进入配置文件中,添加bird.conf 目录设为data, 端口设为81
# 在宿主机生成配置文件 bird.conf
server {
    listen    81;
    location / {
        root   /data;
        index  index.html index.htm;
    }
}
echo '' >bird.conf
docker run -d -p 80:80 -p 81:81 -v /opt/bird:/data -v /opt/bird.conf:/etc/nginx/conf.d/bird.conf nginx:latest
# 方法三
docker run -it -p 80:80 -p 81:81 -v /opt/bird:/data nginx:latest /bin/bash
apt-get updata  # 生成apt-get的缓存
apt-get install vim -y

'''
debian 换源
mv /etc/apt/sources.list /temp/
echo '源' > /etc/apt/sources.list

手动修改DNS
echo 'nameserver 180.76.76.76' >/etc/resolv.conf
'''

自己做docker 镜像

# 想让自己的代码在容器里面跑起来,自己做镜像
1. 启动一个基础容器
docker run -it centos:6.9
docker run -it alpine  # 比较小的liunx发行版
2. 在容器中安装服务,ssh
yum provides sshd   # 查看sshd属于哪个包(openssh-server)
这里可以换源
yum install openssh-server -y
service sshd start  # 秘钥对生成
ls /etc/ssh   # 可以看到启动服务后自动生成的三对秘钥对
echo '123'|passwd --stdin root  
chpasswd  # 也可以改密码
# 可以在另一台服务器上通过ssh 连入到容器中(有秘钥对的情况下可以连上)
ssh root@172.17.0.2
密码:123
# 公钥改变以后要删除 /root/.ssh/known_hosts才可以连上
rm -rf /root/.ssh/known_hosts
3. 把已经安装好的额服务的容器,提交为镜像
exit 退出容器
docker container commit 1ee55652b589 镜像名centos6.9_ssh:v1
4. 测试镜像的功能
docker run -d -p 1022:22 centos6.9_ssh:v1
docker ps -a -l  查看
# docker run -d -p 1022:22 centos6.9_ssh:v1 tail -f /etc/hists  防止服务一起就死
docker run -d -p 1022:22 centos6.9_ssh:v1 /usr/sbin/sshd -D  # 启动服务并夯住
# ssh root@10.0.0.11:1022进行连接 

支持多个服务的docker 镜像

1. 启动一个基础容器
docker run -it -p 81:80 -p 1023:22 centos6.9_ssh:v1 /bin/bash
curl -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo   # 换源
2. 在容器中安装服务
yum install nginx -y
service nginx start
3. 把已经安装好服务的容器提交为镜像
vi /init.sh  # 初始启动脚本
service sshd restart
nginx -g 'daemon off;'

ctrl + p , ctrl + q 退出容器
docker commit 022211a29630 centos6.9_ssh_nginx:v2  # 提交镜像
    
4. 测试镜像的功能
同时其两个服务,需要在容器内写脚本
docker run -d -p 1025:22 -p 83:80 centos6.9_ssh_nginx:v2 /bin/bash /init.sh
# 测试
用ssh连接容器,查看进程 ps -ef nginx是否已经启动

'''
每启动一个容器,宿主机中的 /etc/hosts, /etc/hostname 一些文件会被挂载进来
/etc/resolv.conf,为了宿主机能上网
error:
No package nginx available
solution:
先安装epel, 再安装nginx  yum install epel-release

export SSH_PWD = 123  设置环境变量
unset SSH_PWD   取消环境变量
env|grep SSH   查看环境变量
'''

修改密码

# 默认的镜像不支持修改密码
init.sh 脚本中添加, $SSH_PWD 通过外界传入
if [ -z $SSH_PWD ];then
    SSH_PWD = 123
fi
echo "$SSH_PWD"|passwd --stdin root
#改完脚本需要重新提交镜像
docker commit 18ca45742518 centos6.9_ssh_nginx:v3
docker run -d -p 1026:22 -p 86:80 -e "SSH_PWD=12345" centos6.9_ssh_nginx:v3 /bin/bash /init.sh

其他命令

# 查看系统版本
cat /etc/redhat-release
cat /etc/os-release
# 只看请求头
curl -I 172.17.0.3

grep -Ev '^$|#' default.conf   # 去除注释行,只显示内容
# 所有程序正常起,最后一条 tail -f
tail -F /var/log/nginx/access.log
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!