工作和学习中会遇到好几个不同项目同时开发的情况,由于不同的工程对运行环境的要求是不一样的,甚至会存在不同的工程对同一个库的版本要求不一样,这个时候就需要虚拟化技术或者容器技术了,这里主要是从使用的角度记录一下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的两张图进行说明:
1.2 指令
1.2.1 容器管理
- container
docker container ls # 列出本机正在运行的容器 - create 创建一个新容器
- attach 介入到一个正在运行的容器
通常有下面几种方式进入Docker的容器,推荐使用exec,使用attach一直进入失败。
使用docker attach
使用SSH 为什么不需要在 Docker 容器中运行 sshd
使用nsenter进入Docker容器,nsenter官方仓库
使用docker exec,在1.3.*之后提供了一个新的命令exec用于进入容器 - commit 根据容器的更改创建一个新的镜像
docker commit -m “n changed” my-nginx my-nginx-image # 使用已经存在的容器创建一个镜像
docker commit -m=“First Docker” -a=“wcjiang” a6b0a6cfdacf wcjiang/nginx:v1.2.1
上面命令参数说明:- -m 提交的描述信息
- -a 指定镜像作者
- a6b0a6cfdacf 记住这个是容器id,不是镜像id
- wcjiang/nginx:v1.2.1 创建的目标镜像名
- cp 在本地文件系统与容器中复制 文件/文件夹
docker container cp [containID]:[/path/to/file] . # 从正在运行的 Docker 容器里面,将文件拷贝到本机,注意后面有个【点】拷贝到当前目录
docker cp host_path containerID:container_path - exec 在容器中执行一条命令
docker exec -it [containerID/Names] /bin/bash # 进入容器 - inspect
docker inspect centos # 检查运行中的镜像
docker inspect -f {{.State.Pid}} 44fc0f0582d9 # 获取id为 44fc0f0582d9 的PID进程编号 - kill 杀死一个或多个正在运行的容器
- logs [containerID/Names] 取得容器的日志
- pause 暂停一个或多个容器的所有进程
- ps 列出所有容器
docker ps -a # 查看所有容器(包括正在运行和已停止的) - rename 重命名一个容器
- restart 重新启动一个或多个容器
- rm [containerID/Names] 删除一个或多个容器
docker rm `docker ps -a -q` #:删除所有的container
docker ps -a -q | xargs docker rm #:同上, 删除所有的container
-f 强制中止并运行的容器
-l 删除容器的连接,但保留容器
-v 删除容器挂载的数据卷 - rmi 删除一个或多个镜像
docker rmi image_id # 删除镜像,指定镜像id
docker rmi $(docker images | grep none | awk ‘{print $3}’ | sort -r) # 删除所有镜像 - start [containerID/Names] 启动一个或多个已经停止运行的容器
- stats 显示一个容器的实时资源占用
- stop [containerID/Names] 停止一个或多个正在运行的容器
- top 显示一个容器内的所有进程
- unpause 恢复一个或多个容器内所有被暂停的进程
1.2.2 镜像管理
- image
- build 根据 Dockerfile 构建一个镜像
- images 列出镜像
- load
docker load --input ubuntu_14.04.tar或者
docker load < ubuntu_14.04.tar - pull 拉取一个镜像或仓库到 registry
docker pull ubuntu:16.04 - push 推送一个镜像或仓库到 registry
docker push wcjiang/nginx-test:lastest - save
docker save -o ubuntu_14.04.tar ubuntu:14.04 #存出本地镜像文件为.tar - tag 为镜像创建一个新的标签
docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest
1.2.3 网络管理
- network
- search 在 Docker Hub 中搜索镜像
- login
1.3 docker服务管理
- service docker start # 启动 docker 服务,守护进程
- service docker stop # 停止 docker 服务
- service docker status # 查看 docker 服务状态
1.4 启动容器的参数配置
1.4.1 启动容器执行操作流程
在执行docker run来创建并启动容器时,后台运行的标准包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
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