docker image

docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7

docker image是需要定制化build的一个安装包,包括基础镜像+应用的二进制部署包

docker image内不建议有运行期需要修改的配置文件

Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image

docker image的最佳实践之一是尽量重用和使用网上公开的基础镜像

为docker添加国内镜像,加速下载镜像:

修改配置文件/etc/docker/daemon.json,如果该文件没有则进行创建:

[root@docker ~]# cat /etc/docker/daemon.json
{
"dns": ["192.168.101.2","8.8.8.8"],
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

然后重启docker:

# systemctl restart docker

关于image的一些命令:

搜索镜像:

# docker search nginx

nginx为镜像名称(镜像名称如:centos、nginx、redis)

拉取镜像:

# docker pull nginx 

列出本地镜像:

# docker images(docker images --help)
# docker image ls -a 同样是列出镜像(docker image ls --help查看)

删除镜像:

# docker  rmi nginx    (docker rmi image_name/image_id)
# docker image rm nginx同样是删除镜像(docker image rm image_name/image_id)
-f:force强制删除
  note:如果镜像被容器占用了,需要先删除容器,才能删除镜像

[root@aliyun ~]# docker image ls -q
4760dc956b2d
2d743d41a4ba
57601981c989
5cb13972bd2b
5d4d51c57ea8
006de56999d1

将镜像导出:

# docker save -o centos.tar centos
[root@docker ~]# ll
total
-rw-------. root root Oct : anaconda-ks.cfg
-rw-------. root root Oct : centos.tar

将本地包导入到镜像中:

# docker load --input centos.tar

Docker container:

Docker container是image的实例,共享内核

Docker  container里可以运行不同os的image,比如Ubuntu的或者centos

Docker container不建议内部开启一个sshd服务,1.3版本后新增了docker exec命令进入容器进行排查问题

Docker container没有ip地址,通常不会有服务端口暴露,是一个封闭的沙盒

Docker daemon:

Docker daemon是创建和运行container的Linux守护进程,也是Docker 最主要的核心组件

Docker daemon可以理解为Docker container的container

Docker daemon可以绑定本地端口并提供REST API服务,用来远程访问和控制

Docker container的一些命令操作:

查看容器:

# docker ps

查看所有的容器:

# docker ps -a

启动一个容器:

# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
# docker run 启动一个容器并执行命令(容器是本机host的一个进程,如果进程没有后续操作,那么状态将是exited)

创建一个名称为mycentos的container,并执行/bin/bash:

# docker run --name mycentos centos /bin/bash

  --name:表示容器的name,后面的centos表示使用的哪个镜像(镜像name)

  /bin/bash:表示执行的command

容器可以使用容器id和容器name来识别(与镜像类似)
容器有状态(exited表示已经退出了)
启动容器:

# docker start mycentos

关闭容器:

# docker stop mycentos 

删除容器:

# docker rm mycentos 

上面的操作都可以使用容器的唯一标识(容器名称或者容器id)

-f:force强制删除

创建一个具有tty伪终端的容器:

# docker run -t --name mycentos centos /bin/bash
[root@92f0af59184d /]#

可以看见直接进入到了容器的终端,但是由于没有使用-i(交互功能,所以使用命令会卡住)

此时查看该容器状态:

查看本机host进程:

可以看出进程中包含的一长串字符就是该容器的uuid,由于进程没有关闭所以容器状态就是up

现在将容器关闭掉:

可以看见容器状态已经exited了

而相应的本机host的进程已经结束了

note:docker的容器就是本机host的某一个包含容器uuid的进程,进程关闭了那么容器也就是停止了
删除所有的exited容器:

# docker ps -a -q|xargs docker rm

创建一个以后台模式运行的容器:

[root@docker ~]# docker run -d --name mycentos centos /bin/bash
f61a3e75ebb5f78d1f593e7c92bf2a997077abc38287991818749550367b8150

-d:以后台模式创建,返回容器的uuid

因为创建的只是一个后台运行的容器,容器并没有被安排操作其他的命令(/bin/bash),所以容器的状态还是exited,本机host的进程是没有这个容器的
 
创建一个以后台模式运行不间断的容器:

[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done"
5ef7fa20faa1071ad1a6eff2241368b113cbf45e1b89c6a292907a4f1a3e4269

为什么这里的容器状态一直是up,那是因为执行的命令:sh -c "while true;do echo hello world;sleep 2;done" 是在容器中每隔2s打印一次hello world,并一直循环下去

查看本机host的进程也能看见,进程一直处于运行状态
将运行的容器stop就可以停止掉容器

# docker stop mycentos

可以将停止的状态处于运行状态(当然前提是容器的命令必须有运行的执行)

# docker start mycentos

-t与命令/bin/bash结合进入到了终端,但是却不能操作:

[root@docker ~]# docker run -t --name test saltstack/ubuntu-14.04 /bin/bash
root@b588c6131109:/# ls

上述在终端不具有交互功能,于是加上-i:

[root@docker ~]# docker run -it --name mycentos centos /bin/bash
[root@176f5440f328 /]# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  创建一个进入到了容器终端,并能执行交互命令的容器
  -i:interactive具有交互功能
  /bin/bash:进入到bash环境
  -t:提供伪终端

[root@176f5440f328 /]# exit
exit

exit:表示退出了容器的终端

  退出容器终端后,容器状态也是退出了,本机host进程也停止运行了
  容器的状态会随着command的命令执行而改变
  如果需要将容器持续不断的运行,那么将command变为持续不断的运行就可以

[root@docker ~]# docker run -dt --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done"
8179b8e95e31675986ccda57bb95650d6ea460105e23a67a4e692b7966354250
创建的一个持续不断运行的container(命令是隔两秒打印一次的不中断的)
可以用docker stop container_id 进行停止(停止后就可以删掉了)
停止全部container,并删除:
docker exec和nsenter的区别:

[root@docker ~]# docker exec --help
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container

现在创建一个一直运行的container:

[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done"
292cf95a7853e70978657d7c05f7abd4bff27f1c4e73d97a32b4639d1c0165fc [root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
292cf95a7853 centos "sh -c 'while true..." seconds ago Up seconds mycentos

docker exec表示在一个运行的container中执行命令

Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
--help Print usage
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])

执行某一个命令ls /

[root@docker ~]# docker exec -it 292cf95a7853 ls /
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

还可以标准输入命令:

[root@docker ~]# docker exec  292cf95a7853 echo hello
hello

当docker exec执行如下可以进入到container中:

同等的nsenter命令也可以完全进入到container中:

如果没有这个命令需要进行安装:yum install util-linux

1、确定该container的pid:

[root@docker ~]# docker inspect -f {{.State.Pid}} 292cf95a7853

2、使用nsenter连接:

[root@docker ~]# nsenter --target `docker inspect -f {{.State.Pid}} 292cf95a7853` --net --ipc --pid --mount --uts
[root@292cf95a7853 /]# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

nsenter是关于namespace命名空间的命令,能够是一些资源能够进行隔离

  PID:进程隔离(process id)
  NET:网络接口(network)
  IPC:管理跨进程通信的访问(interprocess communication)
  MNT:管理挂载点(mount)
  UTS:隔离内核和版本标识(unix timesharing system)
  USER:隔离用户
 

转:https://www.cnblogs.com/jsonhc/p/7754982.html

docker镜像、容器以及命令操作的更多相关文章

  1. docker学习笔记2--对镜像/容器的命令操作

    Docker启动一个Centos镜像 我们下载完成一个Centos镜像之后,开始启动 docker run -d -i -t <imageID> /bin/bash 这样就能启动一个一直停 ...

  2. Docker系列之常用命令操作手册

    目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...

  3. Ubuntu下安装Docker,及Docker的一些常用命令操作

    1.什么是 Docker         Docker 是一个开源项目,Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案.         Docker 的基础是 Linux 容器(LXC ...

  4. 二、docker 镜像容器常用操作(让我们用docker 溜得飞起)

    前言 上篇讲了我们如何安装docker,现在该我们一展拳脚的时候了.接下来让我们一起学习一下docker常见的操作,让我们能够会使用 docker. 基本概念 在讲使用之前,还是先将一下docker ...

  5. docker镜像,容器的操作和应用

    镜像操作 拉取镜像 从中央仓库拉取到本地 docker pull 镜像名称[:tag] #举个例子 :docker pull daocloud.io/libarary/tomcat:8.5.-jre8 ...

  6. Docker 镜像 容器 仓库

    Docker 包括三个基本概念镜像(Image)容器(Container)仓库(Repository) Docker 镜像 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资 ...

  7. Docker 镜像介绍和命令

    目录 是什么 UnionFS(联合文件系统) Docker镜像加载原理 分层的镜像 为什么 Docker 镜像要采用这种分层结构呢 特点 Docker镜像commit操作补充 案例演示 1.从Hub上 ...

  8. Docker 镜像 && 容器的基本操作

    镜像 && 容器 docker 镜像好比操作系统的镜像(iso) docker 容器好比是已安装运行的操作系统 所以说 docker 镜像文件运行起来之后,就是我们所说的 docker ...

  9. Docker 镜像/容器操作命令

    一.镜像操作   1.拉取镜像 # docker pull tomcat # docker pull tomcat:8.0.21-jre8 # docker pull 192.168.220.150: ...

随机推荐

  1. BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4997 题意概括 在n*n的区域里,每一个1*1的块都是一个格子. 有k头牛在里面. 有r个篱笆把格 ...

  2. 《Android进阶之光》--事件总线

    No1: EventBus三要素: 1)Event:事件 2)Subscriber:事件订阅者 3)Publisher:事件发布者 No2: EventBus的4种ThreadMode(线程模型): ...

  3. Python 扩展技术总结(转)

    一般来说,所有能被整合或导入到其他Python脚本中的代码,都可以称为扩展.你可以用纯Python来写扩展,也可以用C/C++之类的编译型语言来写扩展,甚至可以用java,C都可以来写 python扩 ...

  4. 一段让自己好好理解reduce的代码

    const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[ ...

  5. 微信里面防止下拉"露底"组件

    前言 在微信里面浏览页面的时候,有一个很管用的方法可以区分这个页面是原生的还是H5形式的.随便打开一个页面,用力往下扯的时候,如果页面上方出现了"黑底",黑底上有一行诸如网页由ga ...

  6. 28BYJ-48步进电机

    28BYJ-48步进电机:1.步进电机是一种将电脉冲转化为角位移的执行机构. 2.通俗一点讲:当步进驱动器接收到 一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角). 3.通过控 ...

  7. [NOIp2012提高组]同余方程

    OJ题号: 洛谷1082 思路: 逆元模板. #include<cstdio> #include<cctype> inline int getint() { char ch; ...

  8. 最小生成树之克鲁斯卡尔(kruskal)算法

    #include <iostream> #include <string> using namespace std; typedef struct MGraph{ string ...

  9. 我的git笔记

    转眼间加入git的阵营已经快两年了,结识git,缘起github,2年前在寻找代码托管网站,当时还是用svn,起初使用google code,可是google的服务虽好,在天朝你懂得,后来发现了git ...

  10. oracle 语句 笔记

    1.查询某个表有多少列. select column_name from user_tab_columns where table_name = 'DQ_S1'; 列出所有的字段名. 2.查询昨天一天 ...