docker镜像和容器的管理
docker images查询本机镜像
docker search 镜像名称 查找镜像
docker pull下载镜像 或 docker pull 镜像名称:标签
latest标签 镜像名称(文件名称)+标签(路径)=唯一 标准格式 busybox:latest
如果没写标签就是默认标签latest,调用镜像时,如果没指定也是latest
docker save 镜像名称:标签 -o 要备份的名字 docker save busybox:latest -o busybox.tar 备份镜像(导出镜像)
docker load -i 备份文件名称 恢复镜像(导入镜像) docker load -i busybox.tar 在镜像文件目录下
docker run -it centos:latest /bin/bash 进入容器 参数:-i交互式 -d后台运行 -t终端 --name容器名字 docker run -参数 容器名字:标签 启动命令 run=创建+启动+进入
启动nginx这样的服务类容器 docker run -itd nginx:latest 后台运行 可以ps -ef | grep nginx 查看
docker ps查看镜像情况 docker ps -a 查看所有镜像 -q只显示id
docker inspect nginx:latest 查看镜像的信息 格式:docker inspect 镜像:标签
docker inspect 镜像id 查看镜像信息(ip)
docker rmi 名称:标签 删镜像 或docker rmi 镜像id 例子:docker rmi centos:latest
删掉nginx这样的服务的容器 docker rm 容器id 需要先stop关闭再删
docker start|stop|restart 容器id 启动|重启|关闭容器
docker rm $(前一条执行的命令) 删掉前一条命令执行的结果 docker rm $(docker ps -aq)删除id不删镜像容器
docker history 镜像名称:标签 查看镜像的制作历史
docker tag 旧镜像名称:旧标签 新镜像名称:新标签名称 docker tag busybox:latest mosy:busybox
docker push 镜像名称:标签 上传镜像
docker rm -f $(docker ps -aq) 强制删掉所有的容器
有人在用的镜像你删了也只能把名字删了,只能先关闭再删
docker tag 容器id nginx:latest 给没有名字的容器改名字标签(<none>这种无主容器)
docker run -it --name 要改的名字 容器名字:标签 创建一个有名字的容器
docker attach 你创建容器的名字(比如haha)前提是你1先用了docker run -it --name haha centos:latest创建了一个叫haha的容器 attach主要用于排错,退出就容器关闭
docker exec -it 容器id 启动命令 docker exec -it 7sssh9f /bin/bash
exec启动新的进程连接,退出不会导致容器关闭,自定义运行新的命令和上帝进程无关,退出而不关闭容器的快捷键ctrl+p+q
docker rm 容器id 删除容器
拷贝文件 docker cp 本机文件路径 容器id:容器内路径(上传)
docker cp 容器id:容器内路径 本机文件路径(下载)
实例:在/yum.repos.d目录下docker cp local.repo haha(自己定义的容器字):/etc/yum.repos.d/local.repo
docker cp local.repo haha:/etc/yum.repos.d/local.repo
容器的启动进程不能被关闭
容器的启动进程必须在前台运行
什么是上帝进程?系统创建初产生的第一个进程
特点:没有父进程 PID=1 所有进程都是他的子进程,孙子进程,曾孙,玄孙进程
上帝进程死亡系统实例也就不存在了
上帝进程退出=容器关闭
容器的启动进程在后台运行不等于容器在后台运行
容器的启动服务:前台服务(-it)
一般是和用户交互的程序,比如/bin/bash,/bin/sh等
后台服务(-itd)
一般是一个程序服务,比如apache,nginx,redis等
还没写完,明天继续docker镜像的制作,有错误可以提出
占用了终端需要打开新终端就是处于前台
打开没有占用前台就是处于后台
所有服务启动都是先起一个父进程pid为1,子进程随意,子进程会杀掉父进程(上帝进程),然后上帝进程死了,容器就崩溃了,所以上帝进程必须放在前台
容器可以放在后台运行,但是启动进程(上帝进程)必须在前台运行
容器在后台运行不等于容器启动进程在后台运行
上帝进程必须放在前台运行(因为没有系统,放在后台代表死亡)
镜像名字加标签等于唯一 用这个查找或标识镜像比较方便
制作镜像方法一:
先docker run -it centos:latest 进入一个新容器
rm -rf /etc/yum.repos.d/*.repo 删除错误文件
exit退出镜像
docker cp /etc/yum.repos.d/yum文件.repo 容器的id:/etc/yum.repos.d/local.repo 复制yum文件到容器内
docker start 容器id 开启容器
docker exec -it 容器id /bin/bash 进入容器
ls cd /etc/yum.repos.d/ 进入并验证
exit退出
docker commit 容器id 镜像名字:标签 列子:docker commit id myos:latest 制作镜像
docker images 查看镜像
docker history 镜像id 查看镜像是不是有四层,就是成功了
commit的局限
很容易制作简单的镜像,碰到复杂的就十分不方便,如:
需要设置默认的启动命令
需要设置环境变量
需要指定镜像开放的某些特定的端口
解决方案:
使用Dockerfile制作
类似脚本的Dockerfile文件
用于制作服务镜像
制作镜像方法二:
制作apache镜像
mkdir apache 在当前目录创建apache目录
cp webhome.tar.gz /root/apache/ 将未解压的网页文件放到apache目录下
cd apache进入
vim Dockerfile 编写类似脚本的创建镜像文件
FROM myos:latest 指定myos就可以省去配置yum源
RUN yum -y install httpd php 安装apache服务
ENV LANG=C 设置环境变量
ADD webhome.tar.gz /var/www/html/ 安装网页文件,会自动解压
WORKDIR /var/www/html/ 指定工作目录
EXPOSE 80 声明开放端口
CMD ["/usr/sbin/httpd", "-DFOREGROUND"] 容器启动命令
验证 docker run -itd myos:httpd
curl -i http://172.17.0.2/
docker build -t myos:httpd . 启动
制作php镜像
mkdir php 创建php目录
cd php 进入
vim Dockerfile 编写文件
FROM myos:latest
RUN yum -y install php-fpm
EXPOSE 9000
CMD ["/usr/sbin/php-fpm", "--nodaemonize"]
docker build -t myos:php-fpm . 生成镜像 . 代表当前目录下
docker images 可以查看到本机多了一个myos:httpd的和myos:php-fpm标签和镜像名字的镜像存在
后台是托管给系统,而容器没有系统,就是直接挂了
文件格式:
FROM:基础镜像
RUN:制作镜像时执行的命令,可以有多个
ADD:复制文件到镜像,自动解压
COPY:复制文件到镜像,不解压
EXPOSE:声明开放的端口
ENV:设置容器启动后的环境变量
WORKDIR:定义容器默认工作目录(等于cd)
CMD:容器启动时执行的命令,仅可以有一条CMD
生成镜像: docker build -t 镜像名称:标签 Dockerfile所在目录
创建nginx镜像:
nginx一般采用编译安装,在容器内编译不容易排错也不便于管理
Dockerfile中ADD可以将一个压缩包在容器内解压释放
利用这个特性我们可以在外部编译nginx,并把编译好的文件打包,使用打包文件构建nginx镜像文件
nginx进程默认在后台运行,可以使用daemon off;强制在前台运行
yum -y install gcc make pcre-devel openssl-devel 装依赖和编译工具
useradd nginx 添加用户
tar -zxvf nginx-1.12.2.tar.gz 解压
cd nginx-1.12.2 进入目录
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module 编译
make && make install 编译
如果要测试网页可以把网页文件拷贝到nginx/html目录下
mkdir nginx 创建
cd nginx 进入
cp /usr/local/nginx.tar.gz ./ 把文件送到当前下
vim Dockerfile
FROM myos:latest
RUN yum install -y pcre openssl && useradd nginx 装包
ADD nginx.tar.gz /usr/local/ 解压
EXPOSE 80 开放80
WORKDIR /usr/local/nginx/html 指定工作目录
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] 启动命令
docker rm -f $(docker ps -aq) 清除下没有用的镜像
docker run -itd myos:nginx 前台启动
完成
对外发布容器服务
docker run -itd -p 80:80 myos:nginx
如果要变成httpd服务,就把nginx停止
没有分配的端口时,可以把内个占用端口的容器删掉
遇到删不掉的容器时,先关服务在删
可以docker stop $(docker ps -aq)
容器共享卷
docker run -itd -v 宿主机对象:容器内对象 镜像名称:标签
使用共享卷动态修改容器内配置文件 mkdir /var/webconf
cp /usr/local/nginx/conf/nginx.conf /var/webconf/
vim /var/webconf/nginx.conf
localtion ~ \.php${
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
绑定 docker run -itd -p 80:80 --name nginx -v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf myos:nginx
验证 docker exec -it nginx /bin/bash
cat /usr/local/nginx/conf/nginx.conf 查看php相关配置是否被映射到容器内
docker 仓库
配置192.168.1.100
yum -y install docker-distribution 安装
systemctl enable --now docker-distribution 启动服务
curl http://192.168.1.100:5000/v2/_catalog
{"repositories":[]}
docker 客户端配置(就是制作镜像的那个机器)
native.cgroupdriver cgroup 驱动,docker默认cgroupfs
registry-mirrors 默认下载仓库,使用国内源快一点
insecure-registries 私有仓库地址(重点)
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://hub-mirror.c.163.com"];
"insecure-registries":["192.168.1.100:5000", "registry:5000"]
}
docker rm -f $(docker ps -eq)
systemctl restart docker 重启
上传镜像
docker tag myos:latest 192.168.1.100:5000/myos:latest
docker push 192.168.1.100:5000/myos:latest
验证测试
curl http://192.168.1.100:5000/v2/_catalog
{"repositories":["myos"]}
curl http://192.168.1.100:5000/v2/myos/tags/list
{"name":"myos","tags":["latest"]}
docker run -it 192.168.1.100:5000/myos:latest 远程镜像启动容器
-p [可选ip]:宿主机端口:容器端口(可有多个)
docker的网络通信模式
host模式,与宿主机共享网络
container模式,共享其他容器的网络命名空间
none模式,无网络模式
bridge模式,默认模式
自定义网络,自由桥接网络或overlay网络
私有仓库概念:共享镜像的一台服务器
仓库配置文件及数据存储路径
/etc/docker-distribution/registry/config.ynl
/var/lib/registry
默认端口号5000
查看私有镜像仓库中的镜像名称或标签
名称:curl http://仓库ip:5000/v2/_catalog
标签:curl http://仓库ip:5000/v2/镜像名称/tags/list
在一个没有任何镜像机器上启动容器
docker run -it 仓库ip:5000/镜像的名称:镜像的标签
为镜像创建标签后上传:
docker tag 镜像:标签 私有仓库ip:5000/镜像:标签
docker push 私有仓库ip:5000/镜像:标签
绑定端口时,端口被分配了,直接删掉那个容器就行了,这样就可以继续分配那个端口了