分割线以下记录的是文档

按照文档内容进行操作,首先在linux上安装docker:

yum -y install docker

然后按照步骤,搜索busybox镜像(从docker hub上远程搜索,需要联网):

docker search busybox

下载镜像

docker pull busybox

 

根据镜像创建容器

docker run -t -i busybox /bin/bash

在这里一直报错

 docker ps -a

发现容器已经被创建了,但是启动不起来,然后

docker start container_id

同样的报错

命令是按照百度来的,后面找大神求教,敲了如下命令:

docker run -tid busybox

成功启动busybox镜像

结论:

每一个docker hub上的镜像都有对应的run命令,如果想正确使用某一个镜像,需要在docker hub官网上去查找镜像对应的run命令,才能正确的启动镜像对应的容器。

 

示例:

这是bitnami/mariadb镜像在docker hub上的启动命令

 错误示范

 

正确命令:

 docker run -tid -e ALLOW_EMPTY_PASSWORD=yes bitnami/mariadb:latest

上图有两个正在运行的docker容器,就是通过正确命令运行成功的,不再演示截图了。

 

 备注:docker run 命令需要带参数

详见对应的链接:点击我

 


 

docker 01

容器技术的核心有以下几个内核技术组成:

CGroups(Control Groups)-资源管理NameSpace-进程隔离

SELinux安全

优势
传统虚拟机需要给每个VM安装操作系统容器使用的共享公共库和程序
启动非常快速
劣势
容器的隔离性没有虚拟化强

共用Linux内核,安全性有先天缺陷SELinux难以驾驭

监控容器和容器排错是挑战
docker 安装
把软件 docker-engine docker-engine-selinux 拷贝到私有yum仓库,运行 createrepo  .

安装 docker
yum clean all
yum install -y docker-engine docker-engine-selinux

设置开机启动,启动 docker 服务
systemctl  enable  docker
systemctl  start   docker

系统刚刚配置完是没有镜像的
查看系统镜像
docker images

从官方源搜索镜像
docker search busybox

下载镜像
docker pull busybox

上传镜像
docker push busybox

把本机镜像备份为 tar 包
docker save busybox >busybox.tar

把备份的tar包导入到本机镜像
docker load <busybox.tar

练习导入镜像

1、查看容器
docker ps

2、创建一个 bash 交互的容器
docker run -it centos /bin/bash

3、创建一个非交互的容器
docker run nginx
docker run -itd centos /bin/bash

查看镜像列表
docker images

查看镜像制作历史docker history busybox

查看镜像底层信息

docker inspect busybox

下载镜像docker pull busybox

上传镜像docker push

删除本地镜像docker rmi busybox

镜像另存为tar包
docker save busybox > busybox.tar

使用tar包导入镜像
docker load <busybox.tar

搜索镜像

docker search busybox

修改镜像名称和标签

docker tag busybox:latest busybox:v1

容器相关命令

以交互模式启动一个容器
docker run -it centos bash

启动的容器放在后台
docker run -itd centos bash

显示正在运行的容器
docker ps

显示所有容器
docker ps -a

显示所有容器,单只显示 id
docker ps -aq

启动,停止,重启容器
docker start|stop|restart  容器id

进入容器
docker exec -it  容器id  /bin/bash

连接容器 console,exit 退出会导致容器关闭,可以使用 CTRL +(p,q) 退出
docker attach 容器id

显示容器详细信息
docker inspect 容器id

查看容器内运行的进程
docker top 容器id

删除容器
docker rm 容器id

关闭所有容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)



 

docker02

增删改数据、安装软件、修改配置文件后,容器另存为镜像
docker run -it centos
修改容器配置环境
配置 yum 源
[rhel7]
name=rhel
baseurl=ftp://192.168.4.254/rhel7
enabled=1
gpgcheck=0

清理缓存
yum clean all
安装软件
yum install -y net-tools
yum install -y psmisc
yum install -y iproute
yum install -y vim-enhancedyum
yum install -y openssh-clients  客户端
yum install -y openssh-server   服务端

安装完成以后,切换到宿主机
对已经修改过的 docker 做镜像
查看修改过的容器的 id
docker ps

把容器做成镜像
docker commit  容器id  新镜像的名称:tag
docker commit  dd61895d9f88 mycentos:latest

查看新的镜像
docker images

用新的镜像生成容器
docker run -it mycentos /bin/bash

进入容器检查,刚刚的配置

利用 Dockerfile 编排镜像
关键字
FROM:基础镜像
MAINTAINER:镜像创建者信息
EXPOSE:开放的端口
ENV:设置变量
ADD:复制文件到镜像
RUN:制作镜像时执行的命令,可以有多个

WORKDIR:定义容器默认工作目录
CMD:容器启动时执行的命令,仅可以有一条CMD

综合 Dockerfile 实验
1、自动配置 yum 的源
2、安装 net-tools psmisc httpd sshd
3、设置容器启动,自动运行 [sshd,httpd]
4、设置默认主页为 Hello World
5、添加用户 user01,并设置默认密码为 123456
6、在宿主机添加映射,把 22,80 映射出去

yum 源配置文件
local.repo
[rhel7]
name=rhel
baseurl=ftp://192.168.4.254/rhel7
enabled=1
gpgcheck=0

Dockerfile 文件配置
FROM centos
MAINTAINER  lix  lix@tedu.cn
ENV  HOSTNAME=web
RUN  rm -f /etc/yum.repos.d/*
ADD  local.repo /etc/yum.repos.d/local.repo
RUN  yum clean all
RUN  yum install -y net-tools psmisc vim-enhanced openssh-clients
RUN  yum install -y openssh-server httpd
WORKDIR  /var/www/html
RUN  echo "Hello World" >index.html
RUN  useradd user01
RUN  echo 123456 |passwd --stdin user01
RUN  chage -d 0 user01
EXPOSE  22
EXPOSE  80
ADD  run.sh /etc/init.d/run.sh
CMD  ["/etc/init.d/run.sh"]

因为每个 images 只能有一个 CMD,我们需要启动两个服务
这里使用一个脚本解决这个问题
run.sh 脚本
#!/bin/bash
/usr/sbin/sshd-keygen >/dev/null 2<&1
/usr/sbin/sshd
/usr/sbin/httpd -DFOREGROUND

配置完以后,build 自定义镜像
docker build -t myimg .

编译成功以后,我们启动容器,这里使用参数 -p 映射端口
[ -p ] 宿主机端口:容器端口
docker run -d -p 80:80 -p 222:22 myimg

容器启动以后:
    可以使用 curl http://宿主机ip/ 访问容器
    可以使用 ssh -l user01 -p 222 宿主机 ip 连接

创建私有仓库
1、docker 的启动文件,添加参数
--insecure-registry=192.168.4.20:5000

systemctl daemon-reload
systemctl restart docker

2、启动私有仓库
docker run -d -p 5000:5000 registry

验证
curl http://192.168.4.20:5000/v2/

3、给镜像打标签
docker tag busybox:latest 192.168.4.20:5000/busybox:latest

4、上传
docker push 192.168.4.20:5000/busybox:latest

验证:
删除本地镜像
docker rmi 192.168.4.20:5000/busybox:latest busybox:latest

使用远程镜像启动容器
docker run -it 192.168.4.20:5000/busybox

查看远程仓库上有什么镜像
http://192.168.4.20:5000/v2/_catalog

查看远程镜像的tag
http://192.168.4.20:5000/v2/<name>/tags/list

查看容器的ip
docker inspect -f {{.NetworkSettings.IPAddress}} 容器id

使用容器挂载共享目录
-d 宿主机源目录:容器内目录
docker run -d -v /var/webroot:/var/www/html myimg

NFS 共享目录
在 docker 的宿主机挂载 NFS 共享目录
在启动容器的时候,使用 -v 参数把 NFS 共享目录挂接进容器

docker 网络管理
查看 docker 网络结构
docker network ls

创建一个网桥
docker network create --driver bridge --subnet=192.168.1.0/24 br1

查看某一个桥的详细信息
docker network inspect 网桥id

创建一个容器,使用新建的网桥
docker run -it --network=br1 myimg /bin/bash


给容器添加网卡
nspid=$(docker inspect -f '{{.State.Pid}}' conid)

ip link add lnet0 type veth peer name rnet0

ip link set dev lnet0 master br0

ip link set dev lnet0 up

ip link set dev rnet0 name eth1 netns ${nspid}

ln -s /proc/${nspid}/ns/net /var/run/netns/${nspid}

ip netns exec ${nspid} ip link set dev eth1 up

ip netns exec ${nspid} ip addr add 192.168.1.100/24 brd 192.168.1.255 dev eth1