Docker 最近很火,因此,也跟着将来的大趋势学下docker,并将docker 应用到项目开发中。
Docker 是一个开源的应用容器引擎,基于 Go 语言 并听从Apache2.0协议开源。Docker 可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化。
容器是彻底使用沙箱机制
,相互之间不会有任何接口(相似 iPhone 的 app),更重要的是容器性能开销极低。php
那么应用容器长什么样子呢,一个作好的应用容器长得就好像一个装好了一组特定应用的虚拟机同样。好比我如今想用MySQL那我就找个装好MySQL的容器,运行起来,那么我就可使用 MySQL了。nginx
那么我直接装个 MySQL不就行了,何须还须要这个容器这么诡异的概念?话是这么说,但是你要真装MySQL的话可能要再装一堆依赖库,根据你的操做系统平台和版本进行设置,有时候还要从源代码编译报出一堆莫名其妙的错误,可不是这么好装。并且万一你机器挂了,全部的东西都要从新来,可能还要把配置在从新弄一遍。可是有了容器,你就至关于有了一个能够运行起来的虚拟机,只要你能运行容器,MySQL的配置就全省了。并且一旦你想换台机器,直接把这个容器端起来,再放到另外一个机器就行了。硬件,操做系统,运行环境什么的都不须要考虑了
。git
在公司中的一个很大的用途就是能够保证线下的开发环境、测试环境和线上的生产环境一致。当年在 Baidu 常常碰到这样的事情,开发把东西作好了给测试去测,通常会给一坨代码和一个介绍上线步骤的上线单。结果代码在测试机跑不起来,开发就跑来跑去看问题,一下子啊这个配置文件忘了提交了,一下子啊这个上线命令写错了。找到了一个 bug 提上去,开发一看,啊我怎么又忘了把这个命令写在上线单上了。相似的事情在上线的时候还会发生,变成啊你这个软件的版本和我机器上的不同……在 Amazon 的时候,因为一个开发直接担任上述三个职位,并且有一套自动化部署的机制因此问题会少一点,可是上线的时候你们仍是胆战心惊。github
若果利用容器的话,那么开发直接在容器里开发,提测的时候把整个容器给测试,测好了把改动改在容器里再上线就行了。经过容器,整个开发、测试和生产环境能够保持高度的一致。redis
此外容器也和VM同样具备着必定的隔离性,各个容器之间的数据和内存空间相互隔离,能够保证必定的安全性。sql
在 ubuntu 下使用 curl 命令进行安装docker
sudo apt install -y curl;
sudo curl -sSL https://get.docker.com/ | sh;
windows 安装请参考 docker 官网。ubuntu
容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操做运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
容器rootfs命令 — docker [commit|cp|diff]
镜像仓库 — docker [login|pull|push|search]
本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
其余命令 — docker [info|version]
vim
docker images
其中咱们能够根据REPOSITORY
来判断这个镜像是来自哪一个服务器,若是没有 /
则表示官方镜像,相似于username/repos_name
表示Github的我的公共库,相似于regsistory.example.com:5000/repos_name
则表示的是私服。
IMAGE ID列实际上是缩写,要显示完整则带上--no-trunc
选项。windows
搜索的范围是官方镜像和全部我的公共镜像。NAME列的 / 后面是仓库的名字。
docker search sameersbn
Usage: docker pull [OPTIONS] NAME[:TAG]
上面的命令须要注意,在docker v1.2版本之前,会下载官方镜像的centos仓库里的全部镜像,而从v.13开始官方文档里的说明变了:will pull the centos:latest image, its intermediate layers and any aliases of the same id,也就是只会下载tag为latest的镜像(以及同一images id的其余tag)。
也能够明确指定具体的镜像:
docker run
命令首先会从特定的image创之上create一层可写的container,而后经过start命令来启动它。中止的container能够从新启动并保留原来的修改。run命令启动参数有不少,如下是一些常规使用说明,更多部分请参考http://www.cnphp6.com/archive...
当利用 docker run 来建立容器时,Docker 在后台运行的标准操做包括:
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
启动一个本地镜像:镜像名REPOSITORY+镜像TAG
> docker run -d sameersbn/postgresql:9.6-2 e527ef6698ea52bb78803facd5d2a6a8cbcdeb98ba052b3a0cdf78478d9acc53
根据容器IDCONTAINER ID
来使运行的容器中止 docker stop CONTAINER ID
。
➜ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f72ed57c80f8 sameersbn/redis:latest "/sbin/entrypoint.sh" 8 minutes ago Up 8 minutes 6379/tcp wonderful_bassi e527ef6698ea sameersbn/postgresql:9.6-2 "/sbin/entrypoint.sh" 14 minutes ago Up 13 minutes 5432/tcp pensive_keller ➜ docker stop f72ed57c80f8
或者使用容器的别名来启动:
docker start MyWordPress
更多命令请看:docker经常使用命令详解
在使用docker时,咱们得先弄清楚docker的几个重要的名词。
Docker生态就像 iPhone 的生态同样,Docker仓库
至关于 IPhone 的 App Store
,docker自身程序
至关于IOS系统
。
镜像(image):指的是以分层的、能够被 LXC/libcontainer
理解的文件存储格式。Docker的应用都是以这种格式发布到Docker仓库中,供你们使用。
容器(container):把应用镜像从 Docker 仓库下载到本地机器上,以镜像为模板,在一个容器类虚拟机中把这个应用启动,这个虚拟机叫作容器。
能够先简单的理解,仓库中的应用都以镜像存在,从仓库中拉取镜像到本地的,叫容器
。
gitlab环境配置要求比较高,可用内存必须2G以上,2核CPU,不然跑不起来。
gitlab 镜像地址:docker-gitlab
Step 1. Launch a postgresql container
docker run --name gitlab-postgresql -d \ --env 'DB_NAME=gitlabhq_production' \ --env 'DB_USER=gitlab' --env 'DB_PASS=password' \ --env 'DB_EXTENSION=pg_trgm' \ --volume $HOME/docker/gitlab/postgresql:/var/lib/postgresql \ sameersbn/postgresql:9.6-2
Step 2. Launch a redis container
docker run --name gitlab-redis -d \ --volume $HOME/docker/gitlab/redis:/var/lib/redis \ sameersbn/redis:latest
Step 3. Launch the gitlab container
docker run --name gitlab -d \ --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \ --publish 10022:22 --publish 10080:80 \ --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \ --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \ --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \ --volume $HOME/docker/gitlab/gitlab:/home/git/data \ sameersbn/gitlab:10.2.2
--volume 方法解释:
--volume $HOME/docker/gitlab/postgresql:/var/lib/postgresql
➜ ~ echo $HOME /Users/kaiyiwang
注意: --volume $HOME/docker
是宿主机的环境,/var/lib/
为容器环境.
OK,安装好以后,咱们能够经过命令来查看 docker 进程
docker ps
再次启动
容器命令:
前边咱们已经安装镜像到本地,若是关闭docker服务以后,容器就会中止运行,再次启动docker以后,咱们不须要再次使用 docker run -d images
,而只需启动容器便可。
docker ps
:查看运行的容器。docker ps -a
:查看全部已经安装的容器
开启容器:
docker start gitlab-postgresql
使用 ifconfig 命令查看本机IP,由于gitlab默认的服务为 10080
,因此,咱们能够根据咱们的IP和端口访问到gitlab服务:http://192.168.1.101:10080/
gitlab页面:
在 gitlab 上新建一个 test 测试库:
使用 docker 搭建 gitlab服务是否是超级方便,不用作什么配置^_^。
相关文章:GitLab的简单使用
Redmine 是一套跨平台的管理系统,它经过“项目(project)”的形式把成员、任务(问题)、文档、讨论及各类形式的资源整合在一块儿,你们参与更新任务、文档等内容来推进项目的进度,另外,它还集成了wiki文档、版本控制、bug跟踪等功能。
在这里,咱们使用 sameersbn/docker-redmine 镜像,项目地址为:https://github.com/sameersbn/...。
拉取镜像:
docker pull sameersbn/redmine:latest
快读启动:
Step 1. Launch a postgresql container
docker run --name=postgresql-redmine -d \ --env='DB_NAME=redmine_production' \ --env='DB_USER=redmine' --env='DB_PASS=password' \ --volume=$HOME/docker/redmine/postgresql:/var/lib/postgresql \ sameersbn/postgresql:9.6-2
Step 2. Launch the redmine container
docker run --name=redmine -d \ --link=postgresql-redmine:postgresql --publish=10083:80 \ --env='REDMINE_PORT=10083' \ --volume=$HOME/docker/redmine/redmine:/home/redmine/data \ sameersbn/redmine:latest
Redmine
Docker指令中,咱们把Redmine的对外服务端口映射到10083,因此,咱们能够经过
访问该地址:http://192.168.1.101:10083/,查看该服务是否安装成功。
安装成功,^_^
咱们使用ps -a
这个命令,咱们能够观察到gitlab-postgresql的状态为已经存在了。
咱们用rm
命令删除这个容器,以下面命令所示:
sudo docker rm gitlab-postgresql
从新创建gitlab-postgresql
这个容器:
docker run --name gitlab-postgresql -d \ --env 'DB_NAME=gitlabhq_production' \ --env 'DB_USER=gitlab' --env 'DB_PASS=password' \ --env 'DB_EXTENSION=pg_trgm' \ --volume $HOME/docker/gitlab/postgresql:/var/lib/postgresql \ sameersbn/postgresql:9.6-2
使用镜像 nginx:latest
,之后台模式启动一个容器,将容器的 80
端口映射到主机的 80
端口,主机的目录 /data
映射到容器的 /data
。
docker run -p 80:80 -v /data:/data -d nginx:latest
将Mac的本地目录挂栽倒容器tensorflow/tensorflow
的/notebooks
目录
docker run -it -v /Users/kaiyiwang/Code/ai/notebooks:/notebooks -d tensorflow/tensorflow
若是直接挂载会报出这样的错误:
44a574c965c83688221798c5d70fff2a7badd3aad04dd071246d8f487bda5225 docker: Error response from daemon: Mounts denied: The path /AI/tensorflow is not shared from OS X and is not known to Docker. You can configure shared paths from Docker -> Preferences... -> File Sharing. See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
在mac上面使用Docker挂载目录时,须要先在Docker->preference
中添加该目录,才能进行挂载!
再重试一次挂载:
➜ tensorflow docker run -it -v /Users/kaiyiwang/Code/ai/notebooks:/notebooks -d tensorflow/tensorflow d1fceb76e44c4050c878a6ce996f59d8252c59d082293674db2ac043e8607f14 ➜ tensorflow
能够看到挂载成功
// 进入容器内部 sudo docker exec -it c7efe /bin/bash
c7efe
为容器ID前几位,经过上边的命令便可进入容器内部。
➜ tensorflow docker exec -it c7efe /bin/bash root@c7efe77f377a:/notebooks# root@c7efe77f377a:/notebooks# jupyter notebook list Currently running servers: http://localhost:8888/?token=44077e3f129fdbf0b26676b5414a36ce8b6a56627ad84a6e :: /notebooks root@c7efe77f377a:/notebooks#
在宿主机环境下重启容器或整个docker
[corwien@lnp php_log]$ sudo docker ps # 查看docker进程 [corwien@lnp php_log]$ sudo docker restart bfc6 # docker 容器重启 # service docker restart sudo systemctl restart docker 若是网络断了,则重启docker就能够了
查看DNS(docker容器在建立实例的时候会拷贝宿主机的到容器里边,若是宿主机的DNS改变了,则须要从新加载容器的)
[root@bfc6f9d528a5 /]# cat /etc/resolv.conf
在容器内部进行了一些修改以后,咱们想把这些保存下来,不想这些在退出或中止这个容器后丢失这些修改,而且咱们还想把这些修改做为其余容器的基础进行重用。
经过 docker commit 命令提交对容器的修改,并建立一个新镜像。
好比咱们新建了一个学习swoole的Ubuntu环境的容器,如今要对这个容器提交生成新的镜像,即:
查看容器:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ee6bfcc1310 7698f "/bin/bash" 4 days ago Up About an hour 0.0.0.0:2221->22/tcp, 0.0.0.0:8880->80/tcp confident_jones
新生成镜像:
$ docker commit 5ee6 ubuntu:swoole
能够看到,新生成了一个swoole标签的镜像:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu swoole 2fb6cd672bdc 39 seconds ago 530MB ubuntu latest a2a15febcdf3 2 weeks ago 64.2MB daocloud.io/ubuntu latest 7698f282e524 3 months ago 69.9MB jaspeen/oracle-11g latest 0c8711fe4f0f 3 years ago 281MB
经过 docker diff 命令来查看在容器中对镜像作出的修改:
$ docker diff 5ee6 ... A /lib/cpp C /root C /root/.profile A /root/.rediscli_history A /root/.ssh A /root/.ssh/id_rsa A /root/.ssh/id_rsa.pub A /root/.ssh/known_hosts A /root/.viminfo A /root/.wget-hsts A /root/.bash_history A /root/.gitconfig A /work C /tmp A /tmp/pear A /tmp/pear/temp C /var C /var/lib C /var/lib/systemd
A 表示文件或者文件夹是新增的,C表示文件内容有修改,D表示该项目已经被删除。
对于已有镜像,可使用docker命令行的 save
和 load
命令来建立一个压缩包;而对于容器,可使用 import
和 export
进行导入导出操做。
镜像操做:
docker save -o update1.tar b2367 docker load < update1.tar
容器:
docker export e556 > update.tar docker import - update < update.tar
https://hub.docker.com 和GitHub同样须要注册一个帐号。
~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu swoole 2fb6cd672bdc 24 minutes ago 530MB
使用docker tag 命令使用你在 Docker Hub上的仓库为这个镜像打上标签,以下所示:
➜ ~ docker tag 2fb6c digtime/ubuntu-swoole ➜ ~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE digtime/ubuntu-swoole latest 2fb6cd672bdc 27 minutes ago 530MB ubuntu swoole 2fb6cd672bdc 27 minutes ago 530MB
推送到docker hub:
$ docker push digtime/ubuntu-swoole The push refers to repository [docker.io/digtime/ubuntu-swoole] f43e13b8cb69: Retrying in 1 second