# 添加 Docker 的 ATP 仓库
sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list"
sudo lsb_release --codename | cut -f2
# trusty
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89.... # Docker 仓库的 GPG 密钥
sudo apt-get update # 更新 APT 源
sudo apt-get install docker-engine
sudo docker info
RHEL 6/CentOS 6
# 安装 EPEL 源
sudo rpm -Uvh http://download.fedoraproject.org/pub/eple/6/i386/epel-release-6-8.noarch.rpm
sudo yum -t install docker-io
docker info
sudo service docker start
sudo service docker enable
RHEL 7
# 要想访问 Red Hat 的 Docker 软件包和文档,必须是 Red Hat 的客户,并拥有 RHEL 服务器订阅授权
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
Fedora
# Fedora 19
sudo yum install -y docker-io
# Fedora 20
sudo yum -y install docker
# Fedora 21
sudo yum -y install docker-io
# Fedora 22
sudo dnf install docker # yum 命令不被推荐使用(由 dnf 命令取代)
OS X 安装 Docker
wget https://github.com/docker/toolbox/releases/download/v1.9.1/DockerToolbox-1.9.1.pkg
# 下载后运行
docker info
Windows 安装 Docker
wget https://github.com/docker/toolbox/releases/download/v1.9.1/DockerToolbox-1.9.1.exe
# 或者可以使用包管理器 Chocolatey 来安装
# 下载后运行
docker info
docker-machine ip # 查看 Docker Toolbox 的 IP 地址(或 echo $DOCKER_HOST)
注意:任何使用卷或带有 -v 选项的 docker run 命令挂载到 Docker 容器的示例都不能在 Windows 上工作。用户无法将宿主机上的本地目录挂载到运行在 Docker Toolbox 虚拟机内的 Docker 宿主机上,因为它们无法共享文件系统。
curl https://get.docker.com./ | sudo sh
wget https://get.docker.com/builds/Linux/x86_64/docker-lastest.tgz
# 启动容器(交互式)
sudo docker run --name bob_the_container -i -t ubuntu /bin/bash
exit
# 查看运行的容器
docker ps -l
# 启动容器
sudo docker start bob_the_container
# 附着到正在运行的容器
sudo docker attach bob_the_container
exit
# 后台运行
sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 查看日志输出
sudo docker logs daemon_dave
sudo docker logs -ft daemon_dave # -f 动态显示,-t 显示时间戳
# 查看容器进程占用情况
sudo docker top daemon_dave
sudo docker stats daemon_dave
# 对容器执行命令
sudo docker exec -d daemon_dave touch /etc/new_config_file
sudo docker exec -t -i daemon_dave /bin/bash
# 停止运行的容器
sudo docker stop daemon_dave
# 自动重启
sudo docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 检查容器详情
sudo docker inspect daemon_dave
sudo docker inspect --format='{{ .State.Runing }}' daemon_dave
sudo docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemove_dave
sudo docker inspect --format='{{ .Name }} {{ .State.Runing }}' daemon_dave bob_the_container # 查看多个容器
# 删除容器
sudo docker rm 80430f
sudo docker rm `sudo docker ps -a -q` # 删除所有容器
# 列出镜像
sudo docker images
sudo docker images ubuntu
# 查找镜像
sudo docker search puppet
# 拉取镜像
sudo docker pull jamtur01/puppetmaster
sudo docker pull ubuntu:12.04
# 运行镜像
sudo docker run -t -i --name new_container ubuntu:12.04 /bin/bash
构建镜像
sudo docker run -i -t ubuntu /bin/bash
apt-get -yqq update
apt-get -y install apache2
exit
# 保存新的镜像
sudo docker commit 4aab3ce3cb76 jamtur01/apache2
sudo docker commit -m "A new custom image" -a "James Turnbull" 4aab3ce3cb76 jamtur01/apache2:webserver
# 基于 Dockerfile 构建镜像
sudo docker build . -t jamtur01/static_web
# 查看分层信息
sudo docker history 22d47c
# 映射端口
sudo docker run -d -p 8080:80 --name static_web jamtur01/static_web nginx -g "daemon off"
# 查看映射到本机的端口
sudo docker port 47a3bc9a 80
# 登录
sudo docker login
# 推送镜像
sudo docker push jamtur01/static_web
# 删除镜像
sudo docker rmi jamtur01/static_web
sudo docker rmi `docker images -a -q`
Dockerfile 关键指令
Dockerfile 示例
FROM ubuntu:14.04
MAINTAINER James Turnbull <james@example.com>
ENV REFRESHED_AT 2014-06-01
RUN apt-get -yqq update
RUN apt-get -yqq install wget
RUN wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch |apt-key add -
RUN echo 'deb http://packages.ealsticsearch.org/logstash/1.4/debian stable main' > /etc/apt/sources.list.d/logstash.list
RUN apt-get -yqq update
RUN apt-get -yqq install logstash
ADD logstash.conf /etc/
WORKDIR /opt/logstash
ENTRYPOINT ["bin/logstash"]
CMD ["--config=/etc/logstash.conf"]
Registry
# 运行 registry 容器
sudo docker run -p 5000:5000 registry:2
sudo docker images jamtur01/static_web
# 打标签
sudo docker tag 22d47c docker.example.com:5000/jamtur01/static_web
# 推送到私有的 registry
sudo docker push docker.example.com:5000/jamtur01/static_Web
sudo docker run -i -t docker.example.com:5000/jamtur01/static_web /bin/bash
# 映射目录
sudo docker run -d -p 80 --name website -v $PWD/website:/var/www/htmlwebsite:ro jamtur01/nginx nginx
Docker Networking
# 创建网络(默认为桥接)
sudo docker network create app
sudo docker network ls
# 加入 app 网络
sudo docker run -d --net=app --name db jamtur01/redis
sudo docker run -p 4567 --net=app --name webapp -t -i -v $PWD/webapp:/opt/webapp jamtur01/sinatra /bin/bash
# 将已有容器连接到网络
sudo docker network connect app db2
sudo docker network inspect app
# 从网络中断开
sudo docker network disconnect app db2
容器链接(只能工作于同一台 Docker 宿主机)
sudo docker run -d --name redis jamtur01/redis
sudo docker run -p 4567 --name webapp --link redis:mydb -t -i -v $PWD/webapp_redis:/opt/webapp jamtur01/sinatra /bin/bash
Linux
sudo bash -c "curl -L https://github.com/docker/compose/releases/download/1.5.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
通过 Pip 安装
sudo pip install -U docker-compose
web:
image: jamtur01/composeapp
# 或 build: /home/james/composeapp
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/composeapp
links:
- reids
redis:
image: redis
# 上述效果同:
sudo docker run -d -p 5000:5000 -v .:/composeapp --link redis:redis --name jamestur01/composeapp python app.py
# 查看帮助
docker-compose help
docker-compose help ps
# 运行 Compose
sudo docker-compose up
sudo docker-compose up -d # 以守护进程运行
# 查看 compose 服务
sudo docker-compose ps
# 查看服务日志
sudo docker-compose logs
# 停止服务
sudo docker-compose stop
# 删除服务
sudo docker-compose rm
sudo docker pull swarm
docker images swarm
sudo docker run --rm swarm create
# b811b0bc438c... 集群 ID
# 在各节点上执行,加入集群
sudo docker run -d swarm join --addr=10.0.0.125:2375 token://b811b0bc438c...
# b4f6bbs... 节点 ID
docker logs b4f6bbs...
sudo docker run -d swarm join --addr=10.0.0.135:2375 token://b811b0bc438c...
# cd4dka3... 节点 ID
docker logs cd4dka3...
# 列出 swarm 节点
sudo docker --rm swarm list token://b811b0bc438c...
# 10.0.0.125:2375
# 10.0.0.135:2375
# 启动 swarm 集群管理者
sudo docker run -d -p 2380:2375 swarm manage token://b811b0bc438c...
# 在 swarm 集群中运行命令
sudo docker -H tcp://localhost:2380 info
# ...
# Nodes: 2
# joker: 10.0.0.135:2375
# ...
# smoker: 10.0.0.125:2375
# ...
for i in `seq 1 6`; do sudo docker -H tcp://localhost:2380 run -d --name www-$i -p 80 nginx; done
sudo docker -H tcp://localhost:2380 ps
# 生成的 6 个容器平均分配在集群的两个节点
# ... nginx ... joker/www-6
# ... nginx ... smoker/www-3
# ... nginx ... joker/www-5
# ... nginx ... smoker/www-4
# ... nginx ... joker/www-2
# ... nginx ... smoker/www-1
注:Swarm 根据过滤器和策略的结合来决定在哪个节点上运行容器