Docker入门(一)

作者: 麦冬 白鲸鱼

docker 是什么

Docker 入门教程

Docker容器是与系统其他部分隔离开的一系列进程,运行这些进程所需的所有文件都由另一个镜像提供,从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多,并且支持在多种主流云平台(PaaS)和本地系统上部署。Docker容器很好地解决了“开发环境能正常跑,一上线就各种崩”的尴尬。

图片描述

  • 轻量:容器是进程级的资源隔离,而虚拟机是操作系统级的资源隔离,所以Docker容器相对于虚拟机来说可以节省更多的资源开销,因为Docker容器不再需要GuestOS这一层操作系统了。
  • 快速:容器的启动和创建无需启动GuestOS,可以实现秒级甚至毫秒级的启动。
  • 可移植性:Docker容器技术是将应用及所依赖的库和运行时的环境技术改造包成容器镜像,可以在不同的平台运行。
  • 自动化:容器生态中的容器编排工作(如:Kubernetes)可帮助我们实现容器的自动化管理。

docker三大核心

图片描述
图片描述

常见应用场景

  • 对应用进行自动打包和部署
  • 创建轻量、私有的PAAS环境
  • 自动化测试和持续整合与部署
  • 部署和扩展web应用、数据库和后端服务

基础部分

安装

Docker操作手册
写的很详细

二进制安装

一般安装方法

这里说下二进制安装,按照官网方式Install static binaries

安装docker在Centos基本上就是yuminstall即可的一件事情(在ubuntu也是apt-get很容易安装),但是在实际环境中,可能遇到企业内网之内无法连接,或者安全合规审查等问题,加之下载增加了安装时间,因此二进制方式安装变成了一种实际的需要。下面是官网的安装方式

图片描述

有些时候会在sudo docker &时候出现错误
可以执行以下下面命令再试。

rm -rf /var/lib/docker 
脚本傻瓜式安装

这里提供写好的脚本,可以把脚本和下载的二进制文件放在同一目录下,然后运行sh install-docker.sh

项目 下载地址
二进制方式安装docker脚本 http://osgp88fat.bkt.clouddn....
二进制的docker安装文件 https://download.docker.com/l...

程序是否正常

sudo docker info

运行容器

docker run命令提供了Docker容器的创建到启动的功能


如果要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则-i -t这两个参数是必不可少的基本参数。

apt-get update && apt-get install vim  //在容器中安装vim
exit //  推出容器,返回到Ubuntu容器的宿主机命令行提示符中

图片描述

查看当前系统中容器列表

sudo docker ps -a 

图片描述
加上-a 会显示正在运行的 和已经停止的所有容器

容器命名

一般docker会为创建的容器生成随机名称,生成指定名称用--name

sudo docker run --name jxtreehouse -i -t ubuntu /bin/bash

图片描述

附着到容器上

像上面那样,docker容器重新启动时候,会沿用docker run 命令的参数来运行,因此我们容器重新启动后会运行一个交互式会话shell。
当然,我们也可以用docker attach命令 重新附着到该容器的会话上

 sudo docker attach jxtreehouse

图片描述

创建守护式容器

除了交互式运行的容器,我们也可以创建长期运行的容器:守护式容器
特点:

  • 没有交互会话
  • 非常适合运行应用程序和服务

所以,大多数时候我们都需要守护式运行我们的容器

sudo docker run --name jxbooks -d  ubuntu /bin/sh -c "while true;do echo hello jx;sleep 1; done"

图片描述
从上面运行结果我们可以看出,docker run命令并没有像上一个容器那样将主机的控制台附着到新的shell会话上,仅仅返回一个容器ID而已,我们还是在主机的命令中。

容器内部运行情况

### 查看日志

sudo docker jxbooks
sudo docker logs jxbooks  // 获取守护式容器日志
sudo docker logs -f jxbooks // 跟踪守护式容器的日志(-f 类似 tail -f)
sudo docker logs -ft jxbooks // 跟踪守护式容器的最新日志 (加上时间戳)

查看容器内的进程

 sudo docker top jxbooks

在容器内部运行进程

在Docker3.1之后,我们可以通过docker exec命令在容器内部额外启动新程序。
可以在容器内运行的进程有两种:

  • 后台任务
  • 交互式任务

后台任务例子:

 sudo docker exec -d jxbooks touch /etc/new_config_file

在jxbooks容器中启动一个如打开shell的交互任务:

 sudo docker exec -t -i jxbooks /bin/bash

和交互式容器一样,这里-t -i 标志为我们执行的进程创建TTY并捕捉STDIN。

停止守护式容器

sudo docker stop jxbooks

jxbooks也可用容器的ID来替代(查看id 可用 docker ps -a

自动重启容器

sudo docker run --restart=always --name jxbooks -d ubuntu /bin/sh -c "while true; do echo hello world; sleep1;done"

--restart=always 无论容器的退出代码是什么,docker都会自动重启容器
还可以设置成 on-failure (只有当容器退出代码为非 0 时候 才会自动重启)

--restart=on-failture:5 //重启次数参数

深入容器

sudo docker inspect jxbooks

删除容器

sudo docker rm  容器名或id //注意运行中的docker容器无法删除,必须先docker stop 或者 docker kill 停止容器

删除所有容器

docker rm `docker ps -a -q`

创建镜像

查看这个docker 入门
.gitignore

.git
node_modules
npm-debug.log

Dockerfile

FROM node:8.4
COPY . /app
WORKDIR /app
RUN ["npm", "install"]
EXPOSE 7001/tcp
zk@zk-TM1604:~/data-screen$ docker image build -t data-screen:0.0.1 .
docker image ls

zk@zk-TM1604:~/data-screen$ docker save data-screen:0.0.1 | gzip > data-screen.tar.gz
zk@zk-TM1604:~/data-screen$ scp -r data-screen.tar.gz root@118.24.153.55:/root/


图片描述
这时候我们项目的根目录下就有了一个docker的镜像压缩文件

导入docker镜像并开发

在合作开发时候,我们拿到一个项目打包好的docker镜像(原开发环境为ubuntu,我们这里拿到镜像后 还用ubuntu做演示,实际开发时候,你可能是在windows 或者centos中拿到这个项目镜像来开发)
比如压缩包名datascreen.tar
这里我用远程服务器演示下:
图片描述

我们在根目录/data文件夹中建一个docker文件夹,进入文件夹,新建tmp文件夹 ,在docker同级目录下新建 datascreen 文件夹 我们将把项目docker镜像文件映射到这里

图片描述

导入容器

sudo docker load < ${PATH}/datascreen.tar  //加载docker打包的镜像 到本宿主机   

运行Docker

sudo docker images //获取image ID
sudo docker run -d -it -p 7001:7001 -v /data/docker/tmp/:/tmp/ {image id} /bin/bash

/data/docker/tmp/ 映射到的宿主机上的目录
/tmp/ {image id} /bin/bash 镜像中的目录

启动容器

sudo docker ps  //查看运行中的容器
sudo docker start f1737f42f13b  //f1737f42f13b 是容器id
sudo docker exec -it f1737f42f13b /bin/bash

运行data-screen

cd data-screen/
nohup ./auto-run.sh &

图片描述
auto-run.sh脚本中的内容,主要是启动mongod 和用node启动入口文件index.js (这个项目是一个nodejs的后台项目)

停止docker 容器

(!危险) 如果是运行在应用上的程序和服务的守护式容器 注意不要随意停止

sudo docker ps
 sudo docker stop <CONTAINER ID>

图片描述

参考

Docker操作手册
第一本docker书
[Docker — 从入门到实践]()
Docker 入门教程
Docker 微服务教程
基于docker+gunicorn部署sanic项目
vue-cli3 项目从搭建优化到docker部署

阅读 1k

推荐阅读
镜心的小树屋
用户专栏

方寸湛然GitHub组织地址:[链接]

47 人关注
123 篇文章
专栏主页