Docker使用实战总结

Docker 最近很火,因此,也跟着将来的大趋势学下docker,并将docker 应用到项目开发中。

1、什么是docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并听从Apache2.0协议开源。Docker 可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化。
容器是彻底使用沙箱机制,相互之间不会有任何接口(相似 iPhone 的 app),更重要的是容器性能开销极低。php

2、为什么要使用容器?

那么应用容器长什么样子呢,一个作好的应用容器长得就好像一个装好了一组特定应用的虚拟机同样。好比我如今想用MySQL那我就找个装好MySQL的容器,运行起来,那么我就可使用 MySQL了。nginx

那么我直接装个 MySQL不就行了,何须还须要这个容器这么诡异的概念?话是这么说,但是你要真装MySQL的话可能要再装一堆依赖库,根据你的操做系统平台和版本进行设置,有时候还要从源代码编译报出一堆莫名其妙的错误,可不是这么好装。并且万一你机器挂了,全部的东西都要从新来,可能还要把配置在从新弄一遍。可是有了容器,你就至关于有了一个能够运行起来的虚拟机,只要你能运行容器,MySQL的配置就全省了。并且一旦你想换台机器,直接把这个容器端起来,再放到另外一个机器就行了。硬件,操做系统,运行环境什么的都不须要考虑了git

在公司中的一个很大的用途就是能够保证线下的开发环境、测试环境和线上的生产环境一致。当年在 Baidu 常常碰到这样的事情,开发把东西作好了给测试去测,通常会给一坨代码和一个介绍上线步骤的上线单。结果代码在测试机跑不起来,开发就跑来跑去看问题,一下子啊这个配置文件忘了提交了,一下子啊这个上线命令写错了。找到了一个 bug 提上去,开发一看,啊我怎么又忘了把这个命令写在上线单上了。相似的事情在上线的时候还会发生,变成啊你这个软件的版本和我机器上的不同……在 Amazon 的时候,因为一个开发直接担任上述三个职位,并且有一套自动化部署的机制因此问题会少一点,可是上线的时候你们仍是胆战心惊。github

若果利用容器的话,那么开发直接在容器里开发,提测的时候把整个容器给测试,测好了把改动改在容器里再上线就行了。经过容器,整个开发、测试和生产环境能够保持高度的一致。redis

此外容器也和VM同样具备着必定的隔离性,各个容器之间的数据和内存空间相互隔离,能够保证必定的安全性。sql

3、安装docker

在 ubuntu 下使用 curl 命令进行安装docker

sudo apt install -y curl;
sudo curl -sSL https://get.docker.com/ | sh;

windows 安装请参考 docker 官网。ubuntu

docker经常使用命令

容器生命周期管理 — 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

一、列出机器上的镜像(images):

docker images

clipboard.png

其中咱们能够根据REPOSITORY来判断这个镜像是来自哪一个服务器,若是没有 / 则表示官方镜像,相似于username/repos_name表示Github的我的公共库,相似于regsistory.example.com:5000/repos_name则表示的是私服。
IMAGE ID列实际上是缩写,要显示完整则带上--no-trunc选项。windows

二、在docker index中搜索image(search)

搜索的范围是官方镜像和全部我的公共镜像。NAME列的 / 后面是仓库的名字。

docker search sameersbn

三、从docker registry server 中下拉image或repository(pull)

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)。
也能够明确指定具体的镜像:

四、从image启动一个container(run)

docker run 命令首先会从特定的image创之上create一层可写的container,而后经过start命令来启动它。中止的container能够从新启动并保留原来的修改。run命令启动参数有不少,如下是一些常规使用说明,更多部分请参考http://www.cnphp6.com/archive...
当利用 docker run 来建立容器时,Docker 在后台运行的标准操做包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像建立并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

启动一个本地镜像:镜像名REPOSITORY+镜像TAG

> docker run -d sameersbn/postgresql:9.6-2
e527ef6698ea52bb78803facd5d2a6a8cbcdeb98ba052b3a0cdf78478d9acc53

clipboard.png

五、中止运行容器

根据容器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经常使用命令详解

4、几个重要的概念

在使用docker时,咱们得先弄清楚docker的几个重要的名词。

Docker生态

Docker生态就像 iPhone 的生态同样,Docker仓库至关于 IPhone 的 App Storedocker自身程序至关于IOS系统

镜像与容器

镜像(image):指的是以分层的、能够被 LXC/libcontainer 理解的文件存储格式。Docker的应用都是以这种格式发布到Docker仓库中,供你们使用。
容器(container):把应用镜像从 Docker 仓库下载到本地机器上,以镜像为模板,在一个容器类虚拟机中把这个应用启动,这个虚拟机叫作容器。

能够先简单的理解,仓库中的应用都以镜像存在,从仓库中拉取镜像到本地的,叫容器

5、安装镜像docker-gitlab

gitlab环境配置要求比较高,可用内存必须2G以上,2核CPU,不然跑不起来。

1.安装

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

clipboard.png

再次启动容器命令:
前边咱们已经安装镜像到本地,若是关闭docker服务以后,容器就会中止运行,再次启动docker以后,咱们不须要再次使用 docker run -d images,而只需启动容器便可。

docker ps:查看运行的容器。
docker ps -a:查看全部已经安装的容器

开启容器:

docker start gitlab-postgresql

clipboard.png

2.测试gitlab

使用 ifconfig 命令查看本机IP,由于gitlab默认的服务为 10080,因此,咱们能够根据咱们的IP和端口访问到gitlab服务:http://192.168.1.101:10080/

clipboard.png

gitlab页面:

clipboard.png

在 gitlab 上新建一个 test 测试库:

clipboard.png

使用 docker 搭建 gitlab服务是否是超级方便,不用作什么配置^_^。

相关文章:GitLab的简单使用

6、项目管理系统Redmine

Redmine 是一套跨平台的管理系统,它经过“项目(project)”的形式把成员、任务(问题)、文档、讨论及各类形式的资源整合在一块儿,你们参与更新任务、文档等内容来推进项目的进度,另外,它还集成了wiki文档、版本控制、bug跟踪等功能。

1.搭建Redmine服务

在这里,咱们使用 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

2.测试

Redmine
Docker指令中,咱们把Redmine的对外服务端口映射到10083,因此,咱们能够经过
访问该地址:http://192.168.1.101:10083/,查看该服务是否安装成功。

clipboard.png

安装成功,^_^

7、docker容器名称冲突

clipboard.png

咱们使用ps -a这个命令,咱们能够观察到gitlab-postgresql的状态为已经存在了。

clipboard.png

咱们用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

docker 容器名称冲突问题解决

8、挂载目录

使用镜像 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中添加该目录,才能进行挂载!

clipboard.png

再重试一次挂载:

➜  tensorflow docker run -it  -v  /Users/kaiyiwang/Code/ai/notebooks:/notebooks -d tensorflow/tensorflow
d1fceb76e44c4050c878a6ce996f59d8252c59d082293674db2ac043e8607f14
➜  tensorflow

能够看到挂载成功

9、进入容器内部

// 进入容器内部
sudo docker exec -it c7efe /bin/bash

c7efe 为容器ID前几位,经过上边的命令便可进入容器内部。

进入jupyter

➜  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#

10、Docker重启

在宿主机环境下重启容器或整个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

11、将对容器的修改提交到镜像

在容器内部进行了一些修改以后,咱们想把这些保存下来,不想这些在退出或中止这个容器后丢失这些修改,而且咱们还想把这些修改做为其余容器的基础进行重用。

经过 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 命令来查看在容器中对镜像作出的修改:

$ 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表示该项目已经被删除。

将镜像和容器保存为tar文件进行共享

对于已有镜像,可使用docker命令行的 saveload 命令来建立一个压缩包;而对于容器,可使用 importexport 进行导入导出操做。

镜像操做:

docker save -o update1.tar b2367

docker load < update1.tar

容器:

docker export e556 > update.tar
docker import - update < update.tar

将修改的镜像发布到 docker hub

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
相关文章
相关标签/搜索