docker将自己描述为“开发人员和系统管理员构建,发布和运行分布式应用程序的开放平台”。Docker允许您运行容器。容器是运行应用程序及其依赖于主机操作系统的沙盒进程。容器内的应用程序认为自己是机器上运行的唯一进程,而机器可以独立运行多个容器。

对于复杂的大型系统,需要众多跨主机容器协同工作,需要支持各种类型的工作负载。即使Docker只需一条命令便可启动容器,一旦试图将其推广到软件开发和生产环境中,麻烦便层出不穷,容器相关的网络、存储、集群、高可用便是不得不面对的问题。容器到容器云的进化也应运而生。

Docker的设计理念是希望用户能保证一个容器只运行一个进程,即只提供一种服务。然而对用户而言,单一容器是无法满足需求的。通常用户需要利用多容器,分别提供不同服务,并在不同容器见互联通信,最后形成一个Docker集群,以实现特定功能。例如:一个简单的Hello world程序就可以被分为6个节点的Docker应用栈。每个节点上都是独立运行的Docker容器。当然还是用的是Docker,只是这时候用Docker ps,就能看到6个进程,或者说6个容器了。但是一般来说,所有Docker的配置、容器内文件的写入方法都是用命令行完成的,很硬核,于是后面出现了Dockerfile。

Docker的优点在于可以简化CI(持续集成)和CD(持续交付),让开发者可以集中精力在开发上,同时测试运维也可以同步执行。

docker介绍

Docker技术架构

docker核心原理

1.为什么docker能实现虚拟化?

从虚拟化的软件实现和硬件实现开始讲起。

架构

存储

由于容器的轻量化设计,其中并没有相应的文本编辑工具,于是需要利用vvolume实现文件创建。

数据

网络

安全

docker进阶

容器化

网络进阶

Dockerfile最佳实践

监控手段

docker命令

用户在使用Docker时,需要使用命令行工具docker与Docker daemon建立通信。Docker daemon是Docker的守护进程,负责接收并分发执行Docker命令。
事实上你输入docker,它就会把所有的命令行命令、参数全部显示出来给你参考。
docker命令

安装docker、部署构建容器

安装docker

安装docker yum install -y docker
配置腾讯云镜像加速(官方的龟速) vim /etc/sysconfig/docker
新增如下参数: OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'
重启docker服务: systemctl restart docker

新建镜像,run容器

docker search 查找镜像,所有容器都基于镜像启动
docker run
1.Docker CLI有一个名为run的命令,它将基于Docker Image启动容器,初次使用镜像时会被下载的到docker主机上。

2.到这一步我们确实运行了容器,但是我们并不能访问,因为每个容器都是沙箱。如果服务需要由不在容器中运行的进程访问,则需要通过主机来开放端口。开放后就可以像访问操作系统一样访问容器中进程。并且在run时使用-p 选项启动容器时绑定端口。并且在启动容器时定义名称很有用,访问日志会更简单。
所以启动redis的命令为:docker run -d --name redisHostPort -p 6379:6379 redis:latest

3.在固定端口上运行进程的问题是一个端口只能运行一个实例,当我们想运行多个实例时,用-p 会让机器在任何一个随机可用端口上暴露容器服务,用ps查看端口映射信息。
docker ps 显示所有正在运行的容器,用于启动容器的图像和正常运行时间,此命令还显示可用于查找有关各个容器的信息的友好名称和ID
docker inspect <friendly-name|container-id> 提供有关正在运行的容器的更多详细信息,例如IP地址。
docker logs <friendly-name|container-id> 将显示容器已写入标准错误或标准输出的消息。

4.很明显在删除容器时,存储的数据会被删掉,而我们需要在重新创建容器时保留并重用数据。方法是,通过命令把容器绑定到本机目录,以此让容器可以访问、更改、写入容器数据到本机。
redis的命令查找后得到为docker run -d --name redisMapped -v /opt/docker/data/redis:/data redis

5.当我不想在以后台方式运行容器时,可以以前台运行,甚至进行一些交互,访问容器内的bash shell。事实上大部分情况下我们都需要进入bash,去操作整个环境。

6.结束这个运行的容器用ctrl+c。

build容器

创建构建镜像的Dockerfile

FROM nginx:alpine // 定义基本镜像
COPY . /usr/share/nginx/html //把当前目录的内容复制到容器内的特定位置

docker build -t <集结目录> 构建(或者说编译)镜像,并制定标签、名称、版本号

docker run -d -p 80:80 webserver-image:v1 把编译的镜像运行起来

docker images 查看当前主机上所有的镜像列表

如何使用数据卷、网络卷

进阶设置

其他命令

docker version 显示 Docker 版本信息
docker info 显示 Docker 系统信息,包括镜像和容器数
docker search 从 Docker Hub 中搜索符合条件的镜像
docker pull 从 Docker Hub 中拉取或者更新指定镜像
docker push 将镜像推送至远程仓库,默认为 Docker Hub
docker login 按步骤输入在 Docker Hub 注册的用户名、密码和邮箱即可完成登录
docker logout 运行后从指定服务器登出,默认为官方服务器
docker images 列出本地所有镜像。对镜像名称进行关键词查询
docker ps 列出所有运行中容器
docker rmi 从本地移除一个或多个指定的镜像
docker rm 从本地移除一个或多个指定的容器
docker history 查看指定镜像的创建历史
docker start|stop|restart 启动、停止和重启一个或多个指定容器
docker kill 杀死一个或多个指定容器进程
docker pause 暂停某一容器的所有进程
docker logs 获取容器运行时的输出日志
docker run 启动一个容器,在其中运行指定命令

相关问题

来自牛客网

1.讲讲docker。答隔离机制,挂载点,线程,还扯了内核调度

2.docker内网IP段是什么。

3.docker如何重写?

4.docker的使用实例

5.docker namespace

6.docker不同容器间怎么通信(答端口映射出来,回复不对);docker资源隔离原理解释一下

2.docker的网络模型,你了解哪几种?

13.如果两个容器需要互相通信,应该怎么做?(估计是提示我用containerd网络模型,我给忘了,只说了其他几种,这里我说的是通过link或者docker create network让两个容器在同一个网络中)

14.docker如何查看进程的相关状态?(我答的docker ps,其实可能是docker logs...)

15.如果有一些容器长期不用,需要删除,怎么做?

16.了解docker的网络通信方案吗?(fannel和calico)

3.Docker Cgroups可以限制哪些资源?cupset和cpushare有啥区别?要是使用cpuset的话,cpu用超了会怎么样?(这里我没答出来,下来想了一下,超了的话也不会影响别的cpu吧,只是说>100%cpu占用会影响应用程序本身,内存用超了可能出现OOM)

3.docker的网络模型?每种网络模型的优缺点

来自Docker常见问题