docker

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

  

  

  

  

  

  

  

  

 

posted @ 2019-02-14 21:07  ForLivetoLearn  阅读(239)  评论(0编辑  收藏  举报