Docker介绍

Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源.

Dockert是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等,用于Docker通过操作系统层的虚拟化是实现隔离,所以Docker容器运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率.

docker官网:https://www.docker.com/

Docker组成

Docker Clien

Docker Server

Dockers组件

镜像(Image)

容器(Container)

仓库(Repository)

Docker和OpenStack对比

Docker的用途

安装Docker

# yum install -y docker

启动docker容器服务

# systemctl start docker.service

docker的使用

  1. 搜索docker中的centos镜像

     # docker search centos
  2. 下载centos镜像

     # docker pull docker.io/centos
  3. 查看镜像

     docker images:           列出images
    docker images -a : 列出所有的images(包含历史)
    docker images --tree : 显示镜像的所有层(layer)
    docker rmi <image ID>: 删除一个或多个image 查看docker中的所有Images镜像信息
    # docker images
  4. 导出docker中的centos镜像到/opt/下名为centos.tar.gz

     # docker save centos > /opt/centos.tar.gz
  5. 导入本地的镜像到docker中

     # docker load < /opt/centos.tar.gz
    b51149973e6a: Loading layer 200.2 MB/200.2 MB
    Loaded image: docker.io/centos:latest200.2 MB
  6. 使用镜像创建容器

     # docker run centos /bin/echo hello,world.
    hello,world. 注:
    run 启动的命令
    centos docker中的镜像名称
    /bin/echo hello,world. 要执行的操作
  7. 列出所有的dockers容器

     # docker ps -a
  8. 自定义创建一个容器

     # docker run --name mydocker -t -i centos /bin/bash
    
     注:
    -name 给容器起个名称
    centos 容器的镜像名称
    -t tty启用一个为终端
    -i 让容器的标准输入保持打开状态
    /bin/bash 执行的命令 启用/bin/bash输出的结果
    [root@fa4af6657ccb /]# ps aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.0 11744 1888 ? Ss 05:10 0:00 /bin/bash
    root 15 0.0 0.0 47440 1672 ? R+ 05:12 0:00 ps aux
    容器的主机名和docker ps -a中的CONTAINER ID是一致的
  9. 如何进入一个容器

     使用docker ps先找到容器的CONTAINER ID(fa4af6657ccb)
    # docker ps -a 利用docker start CONTAINER ID名称即可启动容器
    # docker start fa4af6657ccb 但是这个时候,只是运行了,如何进入到容器里面呢?使用attach即可
    # docker attach fa4af6657ccb
    注意:在容器中exit以后,这个进程就结束了,docker是单进程的,如果想要exit以后不结束进程,需要使用nsenter,如果提示找不到命令,请安装yum install -y util-linux 如何查找容器进程的pid?!,可以通过下面命令获取
    # docker inspect --format "{{.State.Pid}}" fa4af6657ccb
    31809 #进程的PID号 利用nsenter进入到容器中(在docker容器中退出,不会受到影响,改容器依旧在运行,并不会真正的退出/bin/bash)
    # nsenter -t 31809 -u -i -n -p 注:
    -t 是targer pid
    -u 是用户态
    -i 是ipc
    -n 是网络
    -p 是pid

    利用bash脚本传递CONTAINER ID实现docker容器在后台持续运行

    vim ns.sh并输入写入如下内容

    添加执行权限

     # chmod +x ns.sh

    启动docker容器

     # docker start fa4af6657ccb

    运行脚本即可进入指定的docker容器中

     # ./ns.bash fa4af6657ccb
  10. 删除指定docker容器CONTAINER ID

    # docker rm 1e2b79b937a1
    1e2b79b937a1 # docker rm -f fa4af6657ccb
    -f可以删除正在运行的docker容器(不建议这样玩) 如果docker容器只运行一次就删除的,做实验的时候可以这样玩(docker ps -a中并没有保留该容器) # docker run --rm centos /bin/echo 'wtf...'
    wtf...
  11. 删除docker中指定的镜像(IMAGE ID)

    docker rmi 8140d0c64310

    Untagged: docker.io/centos:latest #删除docker镜像中指定的IMAGE ID

    Untagged: docker.io/centos@sha256:bba1de7c9d900a898e3cadbae040dfe8a633c06bc104a0df76ae24483e03c077

    Deleted: sha256:8140d0c64310d4e290bf3938757837dbb8f806acba0cb3f6a852558074345348

    Deleted: sha256:b51149973e6a6c4fb1091ef34ff70002ee307e971b9982075cf226004a93c9b7

Docker网络

下载nginx的Images镜像文件

# docker pull nginx

运行nginx的容器

# docker run -d -P nginx
# docker run -t -p 10000:80 nginx 注:
-P 启用一个随机的端口
-p 指定一个固定端口映射,使用方法

运行成功以后,docker中的nginx的镜像会32768端口会映射到80端口上,可以使用浏览器访问宿主机的ip:port来查看

# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1c52bc516ca nginx "nginx -g 'daemon off" 5 minutes ago Up 5 minutes 0.0.0.0:32768->80/tcp cranky_shannon

可以使用docker logs CONTAINER ID来查看容器的日志

# docker logs b1c52bc516ca

Docker存储

创建一个存储卷的容器

# docker run -i -t --name volume-test -v /data centos

注:
-i -t 进入到新创建的docker容器中
-v 指定挂在的目录
centos Docker中Images基础镜像

列出容器中的所有信息

# docker inspect volume-test

可以过滤查看一下当前容器的volume挂载的相信信息

# docker inspect volume-test | egrep -A10 'Mounts'
"Mounts": [
{
"Name": "83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75",
"Source": "/var/lib/docker/volumes/83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

通过上面查找出来的Source地址(宿主机上的映射存储地址),我们在改目录下创建的文件,都会映射到docker容器中的/data目录下

# cd /var/lib/docker/volumes/83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75/_data && touch volumes-test

切换回docker容器中的/data目录查看

[root@f08eb15c50dd ~]# cd /data && ll
total 0
-rw-r--r--. 1 root root 0 May 21 07:42 volumes-test

另外一种类似于直接挂载的方式使用docker容器的存储

# docker run -it -v /opt:/opt:rw centos

注:
-v 依旧是绑定需要挂在的卷
/opt 第一个/opt是宿主机的目录
/opt 第二个/opt是docker容器中的opt目录
rw 读写的权限
centos Images镜像文件 小技巧:例如该目录是nginx的代码存放目录,我们启动了一个docker容器,该容器就是nginx的服务的docker容器,我们只需要修改docker容器中的配置文件即可实现代码修改就可以直接访问啦~

通过docker挂载单个文件到docker容器中的方法

创建docker容器
# docker run -it --name history -v /root/.bash_history:/root/.bash_history centos 启动docker容器
# docker start history 找到histroy容器的的CONTAINER ID
# docker ps -a | grep 'history' | awk '{print $1}'
da58133ebddf 运行history容器
./ns.bash da58133ebddf

新创建的docker容器使用以存在的docker容器的存储

# docker run -it --name test1 --volumes-from volume-test centos

注:
-it 进去到docker容器内部
--name 新的docker容器的名称
centos docker容器的Images镜像
--volumes-from 从哪个已存在的docker容器(volume-test)

进入到volume-test容器的source目录下并复制/etc/passwd文件,便于在新创建的容器中查看

找到Source的地址
# docker inspect volume-test | grep -A10 'Mounts' 复制文件到Source指定的目录下
# cp /etc/fstab /var/lib/docker/volumes/83a69000df85e917514c7fc2ec43c020bcd02ffc3665705f83645ad75bc11d75/_data 查看下当前运行的docker容器
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc335784084c centos "/bin/bash" 18 minutes ago Up 18 minutes test1 进入到test1的docker环境并查看效果
[root@fc335784084c ~]# cd /data && ll
total 4
-rw-r--r--. 1 root root 501 May 21 08:42 fstab
-rw-r--r--. 1 root root 0 May 21 07:42 volumes-test

手动自定制docker的Images镜像文件

首先需要下载已经存在的centos镜像
# docker pull centos 创建一个mynginx的容器
# docker run --name mynginx -it centos 复制mynginx的容器ID
# docker ps -a | grep 'mynginx' | awk '{print $1}'
cbd772b294c2 在mynginx容器中执行
[root@cbd772b294c2 ~]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm 安装nginx服务
# yum install -y nginx 返回到宿主机的环境中执行创建Image镜像命令
# docker commit -m "my nginx" cbd772b294c2 demon/mynginx:v1
sha256:928a220be50ccaadf90b7bbd453989d8d8cf859485eb7ebe23bcd7e6b1b95c5d 注:
commit -m 提交创建Image镜像
demon 用户名
mynginx 是docker镜像Image的名称
v1 TAG的标签名称 创建另外一个docker容器的
# docker run -it --name nginxv1 demon/mynginx:v1 编辑nginx配置文件,并加入如下配置
# vi /etc/nginx/nginx.conf
daemon off; 创建V2可以支持nginx后台运行的Image镜像文件
# docker commit -m "my nginx" 4099415603df demon/mynginx:v2 映射端口
# docker run -d -p 82:80 demon/mynginx:v2 nginx

Dockerfile构建

docker build /opt/ningx/Dockerfile

# mkdir -p /opt/dockerfile/nginx && cd /opt/dockerfile/nginx/
# vim Dockerfile 以下为Dockerfile的配置文件
# This docker file
# Version 1
# Author: demon
# Base image
From centos #Maintainer
MAINTAINER demon demon_guo@126.com #Commands
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx
#ADD index.html /usr/share/nginx/html/index.html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"] 构建通过Dockerfile创建Image镜像
# docker build -t demon/mynginx:v3 /opt/dockerfile/nginx

通过Dockerfile在自动安装创建Image镜像文件

创建成功以后的截图

简单介绍下Dockerfile中的参数

From        是告知我们要创建的Image镜像是通过哪个基础镜像来的(centos)
MAINTAINER 维护者信息
RUN 需要执行的操作
ADD 要添加的内容,COPY文件可以自动解压
WORKDIR 类似于cd命令
VOLUME 目录的挂载地址
EXPOSE 开放的端口号
CMD  进程一直会运行下去

使用新创建的image镜像创建容器并做端口映射关系

# docker run -d -p 10010:80  demon/mynginx:v3

创建容器成功并访问nginx服务

DockerHub

DockerHub类似于GitHub

docker registry ---> gitlab

下载docker的registry Image镜像
# docker pull registry 创建容器
# docker run -d -p 5000:5000 registry 未完待续....

最新文章

  1. chosen组件实现下拉框
  2. 今天看了shell大神的写的一个统计脚本
  3. awk分隔符设定为多个字符或字符串
  4. Notes(一)
  5. rsync相关整理
  6. 脸识别API微软牛津项目
  7. iOS基础 - 手势识别 与 手势说明
  8. express框架开发案例
  9. SSH密钥对登录的原理和实践
  10. java reflect反射调用方法invoke
  11. 发送邮件--MFMailComposeViewController
  12. 蓝牙重启case之:hardware error
  13. tmux终端复用/tmate终端共享
  14. MySQL服务器发生OOM的案例分析
  15. 微信小程序 template添加点击事件
  16. Ajax初窥
  17. CMake 用法导览
  18. .NET-MVC站点部署到windows server2008r2服务器404错误
  19. vsftpd問題集
  20. netflix vector 系统性能监控安装使用

热门文章

  1. 五、IO编程
  2. python接口测试模版
  3. _itemmod_nopatch、_itemmod_nopatch_level、_itemmod_nopatch_spell、_itemmod_nopatch_src、_itemmod_nopatch_stat、_itemmod_nopatch_stat_prefix
  4. CentOS6.5下搭建VNC服务器
  5. 手动添加jar包到maven仓库
  6. Qt532.容器QMap&amp;QMultiMap
  7. C# 视频多人脸识别的实现
  8. Golang sync
  9. vue 里面引入高德地图
  10. Unity中sharedMaterials 和 materials