docker安装
1.安装docker所需的软件
yum install -y yum-utils device-mapper-persistent-data lvm2
2.添加docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装docker,这里安装的是docker-ce,版本为17+,不加ce的话安装的是13版本。
yum -y install docker-ce
4.关闭selinux并启动并测试
systemctl start docker docker run hello-world
使用docker中国官方镜像加速
[root@localhost ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }
使用阿里镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/mirrors,获取自己的加速器地址
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://r5pbevix.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
使用刀云加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
容器的生命周期
1.检查本地是否存在镜像,如果不存在从远端从库拉取 2.利用镜像启动容器 3.分配一个文件系统,并在只读的镜像层外挂一层可写层 4.从宿主机配置的网桥接口中桥接一个虚拟接口到容器 5.从地址池配置一个ip给容器 6.执行用户指定的命令 7.执行完毕容器终止
镜像管理相关命令
docker image ls:列出镜像列表 build:通过dockerfile创建镜像 history:查看镜像历史 inspect:显示一个或多个镜像详细信息 pull:从镜像仓库拉取镜像 push:推送镜像到镜像仓库 rm:移除一个镜像或多个镜像 prune:移除未使用的镜像。没有被标记或被任何容器使用的 tag:给镜像打标签 export:导出容器文件系统到tar归档 import:导入容器文件系统,--input save:保存一个或多个镜像到tar归档文件,docker save 2f4qfsa4 > xxxx.tar load:加载镜像,docker load < xxxx.tar docker images --no-trunc:查看完整的imagesID -a:查看所有的镜像 -q:只返回id列
容器运行常用选项
docker container run -h:设置容器主机名,就是hostname -i:交互式 -t:分配一个伪终端 -d:在后台运行,itd为常用选项 -e key=value:设置环境变量 --rm:退出后删除容器 -p:发布容器端口到宿主机 HostPort:containerPort 指定端口映射 ip:hostPort:containerPort 指定ip端口映射 ip::containerPort 指定ip随机端口映射 hostPort:containerPort:tcp 指定协议 -p HostPort:containerPort -p HostPort:containerPort:多次指定端口 -P:容器端口随机映射到宿主机 --name:设置容器名字 --ip:指定容器ip,只能用于自定义网络 --link: --network:指定容器所在网络 --mount:挂载宿主机分区到容器 --restart:no|always|no-failure容器退出后是否重新启动容器,默认no -m:容器可以使用的最大内存量 --memory-swap:允许交换到磁盘的内存量 --cpus:限制容器可以使用多少cpu资源,1代表1个cpu,1.5代表一个半 --oom-kill-disable:后面不加参数,禁用自动杀掉容器功能 #创建1核512M的centos镜像 docker run -itd --name cent --cpus 1 --memory 512m --memory-swap 600m centos #映射nginx端口 docker run -itd --name nginx -p 88:80 nginx
容器管理常用命令
docker ps:查看容器列表,-a查看全部 container ls:列出容器 inspect:显示容器详细信息,-f {{ .State.PID }}可以指定内容 exec:在容器中运行命令,如果进入容器docker exec -it 容器名 sh commit:将容器构建成镜像,-a:指定作者,-m:指定附加信息,-p:创建镜像时暂停容器 cp:拷贝文件,docker cp 本地文件 容器名:/保存路径 ,同样可以把容器中的文件拷贝到本地,类似于scp命令 logs:查看容器日志,-f持续输出 port:列出指定容器的端口映射 stats:显示容器资源使用情况 top:显示容器运行的进程 update:更新容器配置,cpu,内存 stop/start/restart:停止/启动/重启容器 rm:删除容器 快速停止所有容器:docker kill `docker ps -a -q` 快速删除所有容器:docker rm `docker ps -a -q`
数据卷常用命令
docker volume create:创建一个卷,卷存在于/var/lib/docker/volumes下(要写的数据在_data下) inspect:查看卷详细信息 ls:查看卷列表 prune:移除没有被使用过的卷 rm:删除数据卷 #1.创建带有数据卷的容器,volume方式(建议方式) #(如果没有指定卷名,自动创建) docker run -itd --name=nginx-test --mount src=容器卷名称,dst=容器内路径 nginx #2.将宿主机的目录或文件映射到容器内,bind方式 #(如果如果源文件或目录不存在会报错) #(如果目标为非空目录,目录内容将被隐藏) docker run -itd --name=nginx-test --mount type=bind,src=宿主机路径,dst=容器内路径 nginx #其他 #docker run --name test1 -d -v /SOURCE:/DEST:rw centos:将本机的/SOURCE目录以读写方式(ro只读)挂载到docker容器的/DEST目录 #docker run --name test2 -d --volumes-from test1 centos:直接使用test1的数据卷
自定义网络
#手动创建动docker网络,不需要考虑ip地址规划,让docker自己解决 docker network create 网络名称 #docker五种网络模式 -net=XXX:与默认的bridge原理一样,网络内具有DNS解析 -net=bridge:默认网络,通过宿主机docker0网桥通信 -net=host:容器与宿主机共用一个ip,除了网络其他都是隔离的 #下面不常用 -net=none:不为容器进行网络配置 -net=container:容器名称/容器ID:与指定容器使用同一个ip,container关键字 #创建容器时指定网络 [root@localhost ~]# docker network create test [root@localhost ~]# docker run -itd --name=db --net=test centos
dockerfile
docker build -t 仓库/镜像名:标签 -f dockerfile . -t:指定制作的镜像名称 -f:指定dockerfile .:指定路径 --no-cache:不使用缓存 FROM:必须为首行,基于哪个镜像构建 MAINTAINER:作者 RUN:后面接命令,在构建镜像时候要执行的命令 ENV:设定环境变量,格式为ENV <key> <value> ADD:复制文件到哪,源文件应放置和dockerfile同目录下,具有解压tar功能 COPY:单纯的复制,没有解压 USER:指定当前用户 WORKDIR:设置当前工作目录 VOLUME:设置卷,通常在创建时候再指定 EXPOSE:设置对外开放的端口 CMD:构建镜像完成之后才会执行的命令,后面接命令,只有最后出现的CMD才生效,同时会被docker run最后传递的命令覆盖 ENTRYPOINT:同CMD,但是不会被覆盖。
示例:编译安装nginx
FROM centos:7 MAINTAINER www.ctnrs.com RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel gd-devel iproute net-tools telnet wget curl && yum clean all && rm -rf /var/cache/yum/* RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && tar zxf nginx-1.15.5.tar.gz && cd nginx-1.15.5 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make -j 4 && make install && rm -rf /usr/local/nginx/html/* && echo "ok" >> /usr/local/nginx/html/status.html && cd / && rm -rf nginx-1.15.5* && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/nginx/sbin COPY nginx.conf /usr/local/nginx/conf/nginx.conf WORKDIR /usr/local/nginx EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
私有仓库镜像
1.下载仓库镜像registry [root@registry ~]# docker pull registry 2.创建镜像容器,加载数据卷并暴露端口 [root@registry ~]# docker run -itd --mount type=bind,src=/docker,dst=/var/lib/registry --name=registry -p 5000:5000 registry 3.在配置文件中添加信任仓库,并重启docker(仓库这里有个逗号) [root@node ~]# vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com"], "insecure-registries": [ "自己镜像仓库ip:5000"] } 4.为已有任意镜像打标签,不指定版本为latest [root@node ~]# docker tag nginx 192.168.183.130:5000/nginx:v2 5.推送镜像至仓库 [root@node ~]# docker push 192.168.183.130:5000/nginx:v2 6.列出镜像仓库中的镜像 [root@node ~]# curl http://192.168.183.130:5000/v2/_catalog {"repositories":["nginx"]} 7.查看指定镜像版本号 [root@node ~]# curl http://192.168.183.130:5000/v2/nginx/tags/list {"name":"nginx","tags":["v2"]} 8.从私有仓库拉取镜像 [root@node ~]# docker pull 192.168.183.130:5000/nginx:v2
Harbor
harbor镜像仓库的下载地址:https://github.com/goharbor/harbor/releases docker-compose下载地址:https://github.com/docker/compose/releases 1.下载压缩包后解压 tar zxvf harbor-offline-installer-v1.5.1.tgz 2.下载docker-compose并给予执行权限 curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 3.将目录切换至harbor配置文件内 cd harbor 4.编辑harbor.cfg配置文件 hostname=当前主机地址 harbor_admin_password=123456 5.执行准备操作并安装 ./prepare ./install.sh 7.添加镜像仓库为可信任 vi /etc/docker/daemon.json {"insecure-registries":["当前主机地址"]} systemctl restart docker 6.通过docker-compose启动和关闭harbor docker-compose up -d:在后台启动harbor docker-compose down:停止并删掉harbor相关容器 7.在浏览器中输入本机地址即可打开harbor 8.在往harbor镜像仓库中推送镜像前,需要先给镜像打标签,可在图形化界面查看打标签方法
docker-compose:根据docker-compose的yml文件
start:开启
stop:关闭
up -d :建立组件并运行在后台
down:关闭组件并删除
打标签
docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] #例: docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
推镜像
docker push 127.0.0.1:5000/ubuntu:latest
构建镜像
docker commit [选项] 容器名称 镜像名称
-a="":指定镜像作者
-m="":指定携带信息
-p:提交时暂停容器
[root@localhost ~]# docker commit -a="author" -m="message" -p red testredhat
遇到的错误
1.docker无法启动,提示selinux问题
可以直接关掉selinux,也可以修改下面的内容 [root@master k8s]# vi /etc/sysconfig/docker OPTIONS='--selinux-enabled=false
2.创建volume卷后,启动容器使用--mount命令,发现没有此命令
使用docker -v命令可以查看docker的版本号,有些命令是在新版本中才有的,如果安装docker时,装的是低版本需要卸载后,重新安装17+版本
3.oci错误,管道错误
原因可能是系统中需要的依赖软件版本太低,需要使用yum upgrade -y命令升级依赖软件,不要使用yum update,这个会把系统内核版本也升上去。
4.docker自定义网络,容器内无法通信
在确认自定义网络没有错误的前提下,可能镜像有问题,换个镜像尝试下
5.docker登陆harbor时提示https错误
1.在要登录的机器上查找docker启动配置文件 [root@bogon ~]# find / -name docker.service 2.编辑这个文件,添加--insecureregistry=harbor主机ip地址 [Service] Type=notify ExecStart=/usr/bin/dockerd -H fd:// -containerd=/run/containerd/containerd.sock --insecureregistry=192.168.183.131 ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always 3.保存退出后,重启服务,再登陆就可以了 [root@bogon ~]systemctl daemon-reload [root@bogon ~]systemctl restart docker 4.查看进程可以看到已经加上了刚才的选项 [root@bogon ~]# ps aux | grep docker root 17547 0.1 2.9 479908 54592 ? Ssl 11:11 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=192.168.183.131 root 18154 0.0 0.0 112724 988 pts/0 S+ 11:19 0:00 grep --color=auto docker
6.更改docker存储文件的位置
# 先停止docker systemctl stop docker # 编辑docker的启动配置,在启动命令后面加上--graph并指定存储位置 vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --graph /new-path/docker # 保存退出后,重载systemd配置 systemctl daemon-reload # 启动docker即可 systemctl start docker