docker搭建开发环境

工作和学习中会遇到好几个不同项目同时开发的情况,由于不同的工程对运行环境的要求是不一样的,甚至会存在不同的工程对同一个库的版本要求不一样,这个时候就需要虚拟化技术或者容器技术了,这里主要是从使用的角度记录一下docker的用法,供自己学习用,也供大家参考。

零、安装docker

step1:本地安装docker ce,并测试hello world通过;
step2:修改镜像源:/etc/docker/daemon.json
step3:拉取基础镜像:sudo docker pull ubuntu:16.04
step4:利用基础镜像启动一个容器:sudo docker run -v /path/to/hostdir:/mnt --net=“host” -it --name=“dev” ubuntu:16.04 /bin/bash
step5:更新源:apt update && apt install vim && cp /etc/apt.sources.list /etc/apt.sources.list
.bak && vim /etc/apt/sources.list
粘贴如下内容:
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
然后
apt clean
apt update
step6:安装各种依赖库
apt install python3
step7:拷贝静态库文件

一、基础概念和指令

1.1 对象集的层次关系

为了更形象的说明docker中对象的层析关系,这里参考https://www.cnblogs.com/whych/p/9446032.html的两张图进行说明:
docker搭建开发环境_第1张图片
docker搭建开发环境_第2张图片
docker搭建开发环境_第3张图片

1.2 指令

1.2.1 容器管理

  1. container
    docker container ls # 列出本机正在运行的容器
  2. create 创建一个新容器
  3. attach 介入到一个正在运行的容器
    通常有下面几种方式进入Docker的容器,推荐使用exec,使用attach一直进入失败。
    使用docker attach
    使用SSH 为什么不需要在 Docker 容器中运行 sshd
    使用nsenter进入Docker容器,nsenter官方仓库
    使用docker exec,在1.3.*之后提供了一个新的命令exec用于进入容器
  4. commit 根据容器的更改创建一个新的镜像
    docker commit -m “n changed” my-nginx my-nginx-image # 使用已经存在的容器创建一个镜像
    docker commit -m=“First Docker” -a=“wcjiang” a6b0a6cfdacf wcjiang/nginx:v1.2.1
    上面命令参数说明:
    1. -m 提交的描述信息
    2. -a 指定镜像作者
    3. a6b0a6cfdacf 记住这个是容器id,不是镜像id
    4. wcjiang/nginx:v1.2.1 创建的目标镜像名
  5. cp 在本地文件系统与容器中复制 文件/文件夹
    docker container cp [containID]:[/path/to/file] . # 从正在运行的 Docker 容器里面,将文件拷贝到本机,注意后面有个【点】拷贝到当前目录
    docker cp host_path containerID:container_path
  6. exec 在容器中执行一条命令
    docker exec -it [containerID/Names] /bin/bash # 进入容器
  7. inspect
    docker inspect centos # 检查运行中的镜像
    docker inspect -f {{.State.Pid}} 44fc0f0582d9 # 获取id为 44fc0f0582d9 的PID进程编号
  8. kill 杀死一个或多个正在运行的容器
  9. logs [containerID/Names] 取得容器的日志
  10. pause 暂停一个或多个容器的所有进程
  11. ps 列出所有容器
    docker ps -a # 查看所有容器(包括正在运行和已停止的)
  12. rename 重命名一个容器
  13. restart 重新启动一个或多个容器
  14. rm [containerID/Names] 删除一个或多个容器
    docker rm `docker ps -a -q` #:删除所有的container
    docker ps -a -q | xargs docker rm #:同上, 删除所有的container
    -f 强制中止并运行的容器
    -l 删除容器的连接,但保留容器
    -v 删除容器挂载的数据卷
  15. rmi 删除一个或多个镜像
    docker rmi image_id # 删除镜像,指定镜像id
    docker rmi $(docker images | grep none | awk ‘{print $3}’ | sort -r) # 删除所有镜像
  16. start [containerID/Names] 启动一个或多个已经停止运行的容器
  17. stats 显示一个容器的实时资源占用
  18. stop [containerID/Names] 停止一个或多个正在运行的容器
  19. top 显示一个容器内的所有进程
  20. unpause 恢复一个或多个容器内所有被暂停的进程

1.2.2 镜像管理

  1. image
  2. build 根据 Dockerfile 构建一个镜像
  3. images 列出镜像
  4. load
    docker load --input ubuntu_14.04.tar或者
    docker load < ubuntu_14.04.tar
  5. pull 拉取一个镜像或仓库到 registry
    docker pull ubuntu:16.04
  6. push 推送一个镜像或仓库到 registry
    docker push wcjiang/nginx-test:lastest
  7. save
    docker save -o ubuntu_14.04.tar ubuntu:14.04 #存出本地镜像文件为.tar
  8. tag 为镜像创建一个新的标签
    docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest

1.2.3 网络管理

  1. network
  2. search 在 Docker Hub 中搜索镜像
  3. login

1.3 docker服务管理

  1. service docker start # 启动 docker 服务,守护进程
  2. service docker stop # 停止 docker 服务
  3. service docker status # 查看 docker 服务状态

1.4 启动容器的参数配置

1.4.1 启动容器执行操作流程

在执行docker run来创建并启动容器时,后台运行的标准包括:

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  2. 利用镜像创建并启动一个容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
  4. 从宿主机配置的网桥接口中桥接一个虚拟接口到容器
  5. 从地址池配置一个ip地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被终止

1.4.2 启动参数说明

docker run -t -i nginx:latest /bin/bash
docker run -itd --name my-nginx2 nginx # 通过nginx镜像,【创建】容器名为 my-nginx2 的容器
docker run -itd my-nginx /bin/bash # 创建一个守护状态的Docker容器

  • -d, --detach=false # 指定容器运行于前台还是后台,默认为false
  • -i, --interactive=false # 打开STDIN,用于控制台交互
  • -t, --tty=false # 分配tty设备,该可以支持终端登录,默认为false
  • -u, --user="" # 指定容器的用户
  • -a, --attach=[] # 登录容器(必须是以docker run -d启动的容器)
  • -w, --workdir="" # 指定容器的工作目录
  • -c, --cpu-shares=0 # 设置容器CPU权重,在CPU共享场景使用
  • -e, --env=[] # 指定环境变量,容器中可以使用该环境变量
  • -m, --memory="" # 指定容器的内存上限
  • -P, --publish-all=false # 指定容器暴露的端口
  • -p, --publish=[] # 指定容器暴露的端口
  • -h, --hostname="" # 指定容器的主机名
  • -v, --volume=[] # 给容器挂载存储卷,挂载到容器的某个目录
  • –volumes-from=[] # 给容器挂载其他容器上的卷,挂载到容器的某个目录
  • –cap-add=[] # 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
  • –cap-drop=[] # 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
  • –cidfile="" # 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
  • –cpuset="" # 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
  • –device=[] # 添加主机设备给容器,相当于设备直通
  • –dns=[] # 指定容器的dns服务器
  • –dns-search=[] # 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
  • –entrypoint="" # 覆盖image的入口点
  • –env-file=[] # 指定环境变量文件,文件格式为每行一个环境变量
  • –expose=[] # 指定容器暴露的端口,即修改镜像的暴露端口
  • –link=[] # 指定容器间的关联,使用其他容器的IP、env等信息
  • –lxc-conf=[] # 指定容器的配置文件,只有在指定–exec-driver=lxc时使用
  • –name="" # 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
  • –net=“bridge” # 容器网络设置: bridge/使用docker daemon指定的网桥;host/容器使用主机的网络;container:NAME_or_ID/使用其他容器的网路,共享IP和PORT等网络资源;none/容器使用自己的网络(类似–net=bridge),但是不进行配置
  • –privileged=false # 指定容器是否为特权容器,特权容器拥有所有的capabilities
  • –restart=“no” # 指定容器停止后的重启策略: no:容器退出时不重启 ;on-failure:容器故障退出(返回值非零)时重启 ;always:容器退出时总是重启
  • –rm=false # 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
  • –sig-proxy=true # 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

二、制作dokcer镜像

因为docker的安装在之前的基础环境配置中已经完成了,所以这里一开始就讲docker镜像的制作。

1.1 容器提交为本地镜像

1.2 dockerfile创建镜像

创建文件:

touch Dockerfile .dockerignore

其中.dockerignore 文件内容,下面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。

.git
node_modules
npm-debug.log

Dockerfile 文件内容

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
  • FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
  • COPY . /app:将当前目录下的所有文件(除了 .dockerignore 排除的路径),都拷贝进入 image 文件的 /app 目录。
  • WORKDIR /app:指定接下来的工作路径为/app。
  • RUN npm install:在/app目录下,运行 npm install 命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
  • EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。

有了 Dockerfile 文件以后,就可以使用 docker image build 命令创建 image 文件了。

$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .

上面命令,-t 参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是 latest。注意后面有个 .,表示 Dockerfile 文件所在的路径为当前路径

参考链接:
https://github.com/jaywcjlove/docker-tutorial

你可能感兴趣的:(环境配置,docker)