工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表分类:docker

使用Docker Compose管理多个容器

Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。
- github.com/docker/compose
一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。完整的命令列表如下:

build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器
参考 https://docs.docker.com/compose/install/ 。你能运行Compose在OSX和64位Linux。当前不支持Windows操作系统。

8.1. 安装Docker Compose

curl -L https://github.com/docker/compose/releases/download/1.4.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod  x /usr/local/bin/docker-compose

8.2. 配置文件

1.Compose的配置文件是docker-compose.yml。让我们看看下面这个文件:
mysqldb: image: [classroom.example.com:5000/]mysql environment: MYSQL_DATABASE: sample MYSQL_USER: mysql MYSQL_PASSWORD: mysql MYSQL_ROOT_PASSWORD: supersecret mywildfly: image: [classroom.example.com:5000|arungupta]/wildfly-mysql-javaee7 links: - mysqldb:db ports: - 8080

这个文件在 https://raw.githubusercontent. ... dees/ ,它表明:
a. 定义了两个服务分别叫做mysqldbmywildfy
b. 使用image定义每个服务的镜像名
c. MySQL容器的环境变量定义在environment
d. MySQL容器使用links和WildFly容器链接
e. 使用ports实现端口转发

8.3. 启动服务

1.如果你从互联网运行,将docker-compose-internet.yml保存为docker-compose.yml

2.如果你使用教师给的镜像,将docker-compose-instructor.yml保存为docker-compose.yml

3.使用下面的命令,所有的服务将使用后台模式被启动
docker-compose up -d

显示的输出如下:
Creating attendees_mysqldb_1... Creating attendees_mywildfly_1...
使用-f指定代替的compose文件。
使用-p指定代替compose文件所在的目录。

4.验证启动的服务
docker-compose ps     Name                       Command               State                Ports attendees_mysqldb_1     /entrypoint.sh mysqld            Up      3306/tcp attendees_mywildfly_1   /opt/jboss/wildfly/customi ...   Up      0.0.0.0:32773->8080/tcp

这里提供了一个整合的列表显示所有启动的服务和容器。

同时,通常使用docker ps命令来验证应用的容器,和在Docker主机上运行的其他容器。
docker ps CONTAINER ID        IMAGE                                    COMMAND                CREATED             STATUS              PORTS                              NAMES 3598e545bd2f        arungupta/wildfly-mysql-javaee7:latest   "/opt/jboss/wildfly/   59 seconds ago      Up 58 seconds       0.0.0.0:32773->8080/tcp         attendees_mywildfly_1 b8cf6a3d518b        mysql:latest                             "/entrypoint.sh mysq   2 minutes ago       Up 2 minutes        3306/tcp                        attendees_mysqldb_1
 
 
http://dockone.io/article/834

docker install in centos7

 vi /etc/yum.repos.d/docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
 
yum install docker-engine
 
systemctl enable docker.service 
systemctl start docker

Docker 清理命令集锦

 杀死所有正在运行的容器

复制代码代码如下:
docker kill $(docker ps -a -q)

 

 删除所有已经停止的容器

复制代码代码如下:
docker rm $(docker ps -a -q)

 

 删除所有未打 dangling 标签的镜像

复制代码代码如下:
docker rmi $(docker images -q -f dangling=true)

 

 删除所有镜像

复制代码代码如下:
docker rmi $(docker images -q)

 

 为这些命令创建别名

复制代码代码如下:
# ~/.bash_aliases

 

# 杀死所有正在运行的容器.
alias dockerkill='docker kill $(docker ps -a -q)'

# 删除所有已经停止的容器.
alias dockercleanc='docker rm $(docker ps -a -q)'

# 删除所有未打标签的镜像.
alias dockercleani='docker rmi $(docker images -q -f dangling=true)'

# 删除所有已经停止的容器和未打标签的镜像.
alias dockerclean='dockercleanc || true && dockercleani'

另附上docker常用命令

docker version #查看版本

 docker search tutorial#搜索可用docker镜像

 docker pull learn/tutorial #下载镜像

 docker run learn/tutorial echo "hello word"#在docker容器中运行hello world!

 docker run learn/tutorial apt-get install -y ping#在容器中安装新的程序

保存镜像

首先使用docker ps -l命令获得安装完ping命令之后容器的id。然后把这个镜像保存为learn/ping。
 提示:
 1.运行docker commit,可以查看该命令的参数列表。
 2.你需要指定要提交保存容器的ID。(译者按:通过docker ps -l 命令获得)
 3.无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分。(译者按:非常类似git里面的版本号)
 正确的命令:
docker commit 698 learn/ping

运行新的镜像

docker run lean/ping ping www.google.com

检查运行中的镜像

现在你已经运行了一个docker容器,让我们来看下正在运行的容器。
 使用docker ps命令可以查看所有正在运行中的容器列表,使用docker inspect命令我们可以查看更详细的关于某一个容器的信息。
 目标:

查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息。
 提示:

可以使用镜像id的前面部分,不需要完整的id。
 正确的命令:
docker inspect efe

Docker 技巧:删除 Docker 容器和镜像

 

删除所有未运行 Docker 容器

docker rm $(docker ps -a -q)

删除所有 Docker 镜像

删除所有未打 tag 的镜像

docker rmi $(docker images -q | awk '/^<none>/ { print $3 }')

删除所有镜像

docker rmi $(docker images -q)

根据格式删除所有镜像

docker rm $(docker ps -qf status=exited)
docker rmi $(docker images --filter dangling=true -q
执行这条命令删除pull过程或者create过程产生的临时镜像,剩下的都是有用的镜像。镜像是一层层叠加起来的,你使用的是带名字和tag的发布镜像,那些中间镜像没有名字,只有哈希,所以叫none。。
这个是列出所有的镜像的。因为某些镜像间存在依赖关系。你要知道docker跟git一样,有“层”的概念。你用docker pull ubuntu的时候就会发现,会pull下来一堆镜像,然后最后一个镜像tag为ubuntu:latest。

Docker 之Dockerfile 快速学习(二)

 Dockerfile文件的说明:

格式:

INSTRUCTION arguments

虽然指令忽略大小写,但建议用大写

# 是注释

MAINTAINER命令:

MAINTAINER命令用来指定维护者的姓名和联系方式

 

FROM命令:

FROM <image>/<image>:<tag>

这个是设置基本的镜像,为后续的命令使用,所以应该作为Dockerfile的第一条指令

比如:

FROM centos6-base

 

RUN 命令:

会上面FROM 指定的镜像里执行任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到

格式:

RUN <command> (这个命令运行一个shell中 - '/bin/sh -c')

或:

RUN ["executable", "param1", "param2"]

RUN 命令等价于:

docker run image_name command

 

CMD  and  ENTRYPOINT

 

命令设置在容器启动时执行命令

 

ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖,需谨记

CMD,表示镜像运行默认参数,可被重写覆盖

ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!

需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!

 

ENTRYPOINT/CMD,一般两者可以配合使用,比如:

ENTRYPOINT ["/usr/sbin/sshd"]

CMD ["-D"]

 

** 在Docker daemon模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。***

 

以下无效方式:

ENTRYPOINT service tomcat7 start #运行几秒钟之后,容器就会退出

CMD service tomcat7 start #运行几秒钟之后,容器就会退出

 

这样有效:

ENTRYPOINT service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out

# 或者

CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out

这样也有效:

ENTRYPOINT ["/usr/sbin/sshd"]

CMD ["-D"]

 

 

USER 命令

比如指定 memcached 的运行用户,可以使用上面的 ENTRYPOINT or CMD来实现:

ENTRYPOINT ["memcached", "-u", "daemon"]

更好的方式:

ENTRYPOINT ["memcached"]

USER daemon

 

EXPOSE 命令

 

EXPOSE 命令可以设置一个端口在运行的镜像中暴露在外

在docker使用--link来链接两容器时会用到相关端口

EXPOSEd <port>

 

ENV命令:

用于设置环境变更

使用此dockerfile生成的image新建container,可以通过 docker inspect CONTAINER ID  看到这个环境变量

也可以通过在docker run时设置或修改环境变量

 

ADD 命令:

从src复制文件到container的dest路径:

ADD <src> <dest>

 

<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url

<dest> 是container中的绝对路径

 

VOLUME 命令

VOLUME ["<mountpoint>"]

如:

VOLUME ["/data"]

创建一个挂载点用于共享目录

 

WORKDIR 命令

WORKDIR /path/to/workdir

配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径

可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令

比如:

WORKDIR /a WORKDIR b WORKDIR c RUN pwd

其实是在 /a/b/c 下执行 pwd

 

Dockerfile文件到此介绍完毕。

下面是一个完整的Dockerfile文件

#Dockerfile

FROM centos6-base

MAINTAINER zhou_mfk <zhou_mfk@163.com>

RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key

RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd

RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh

EXPOSE 22

RUN echo 'root:redhat' | chpasswd

RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

RUN yum install tar gzip gcc vim wget -y

ENV LANG en_US.UTF-8

ENV LC_ALL en_US.UTF-8

CMD /usr/sbin/sshd -D

#End

centos下安装docker最新版教程

 1、通过yum安装

需要root或者能sudo的权限


yum包更新到最新
$ sudo yum update


添加Docker yum源
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF


安装Docker包
$ sudo yum install docker-engine


启动Docker守护进程
$ sudo service docker start


通过测试镜像运行一个容器来验证Docker是否安装正确
$ sudo docker run hello-world


2、通过脚本安装
需要root或者能sudo的权限


yum包更新到最新
$ sudo yum update


运行Docker安装脚本
$ curl -sSL https://get.docker.com/ | sh
这个脚本会添加docker.repo仓库并且安装Docker


启动Docker守护进程
$ sudo service docker start


通过测试镜像运行一个容器来验证Docker是否安装正确
$ sudo docker run hello-world


创建一个Docker用户组
docker守护进程绑定在Unix socket 而不是 TCP 端口。默认情况下Unix socket属于root用户和具有sudo权限用户的使用范畴。出于这个原因,docker守护进程需要一直在root用户下面运行。
To avoid having to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.
为了避免运行docker命令的时候需要使用sudo命令,创建一个叫docker的Unix用户组并将需要运行docker的用户添加进去。当开始运行docker守护进程,会令docker用户组的成员拥有Unix socket的读写权限。
创建docker用户组并添加用户:
1.需要root或者能sudo的权限


2.创建docker用户组并添加用户
sudo usermod -aG docker your_username


3.退出并且登录到your_username,如果在your_username下也建议退出再重新登录一次,这确保您的用户正在运行正确的权限。


4.验证运行docker已不再需要sudo命令

$ docker run hello-world
开机运行docker
$ sudo chkconfig docker on