常用命令:
sudo docker image ls 查看镜像
sudo docker image rm [imageName] 删除镜像
sudo docker pull ubuntu:16.04 拉取镜像
sudo service docker start/restart 启动
sudo docker run hello-world 运行镜像
sudo docker run -it hello-world 运行镜像 (-d 后台执行)
sudo docker run -d --name=demo hello-world 制定名字
sudo docker run -d --name demo --link test1 hello-world link到test1容器上,可直接通过test1容器名访问该容器
sudo docker run --memory=200M hello-world 限定内存
sudo docker run --cpu-shares=10 --name=demo hello-world 限定CPU权重
sudo docker history image-id 查看image分层
sudo docker image build 从Dockerfile构建镜像(better than commit)
sudo docker container ls 查看容器
sudo docker container ls --all 查看所以容器
sudo docker container start/stop [containID] 启动/停止容器(containID也可以为container_name)
sudo docker container rm [containerID] 删除容器
sudo docker rm $(docker container ls -aq) 删除所有容器
sudo docker rm $(docker container ls -f "status=exited" -q) 删除所有已停止的容器
sudo docker container commit container_name dockerhub_ID/new_image_name 提交容器内的改变到新的镜像(不提倡)
sudo docker run -it imageID /bin/bash debug使用进入镜像生成的容器
sudo docker exec -it containerID /bin/bash 进入正在运行的容器中
sudo docker exec -it containerID ip a 正在运行的容器的IP
sudo docker inspect containerID 查看容器的信息
sudo docker logs containerID 查看容器的log
sudo docker network ls 查看docker网络
sudo docker network inspect networkID 查看网络详情
vagrant:更方便的使用Virtual Box 创建VM学习Docker
vagrant创建vm:
①新建目录
②vagrant init centos/7或ubuntu/xenial64(ub16.04) 初始化vagrantfile
③vagrant up 创建vm
vagrant ssh 连接vm exit退出
vagrant status 查看vm状态
vagrant halt 停止vm
vagrant destroy 删除vm
vagrant plugin install vagrant-scp 安装vagrant-scp,用于将本地文件复制到vm(不要使用apt-get安装vagrant)
安装Docker:
①参考网页:
https://blog.csdn.net/qf0129/article/details/80383098
https://www.jianshu.com/p/1eda596d34a3
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
②参考官网
③vagrantfile中配置安装Docker并启动命令(运行vagrant up即可:ub系统没运行成功还是手动安装的docker):
在vagrantfile config.vm.provision "shell"中添加安装docker的所有命令,这样便可以vagrant up创建Docker vm。
④Docker machine(可参考https://www.jianshu.com/p/cc3bb8797d3b)
不使用vagrant,使用docker-machine create demo 创建安装Docker的vm 可以在virtual box中查看
docker-machine ls 查看vm
docker-machine ssh demo 进入vm
docker-machine start 运行vm
docker-machine stop 停止vm
docker-machine
docker-machine 查看其他命令
exit 退出
远程管理docker server:
①docker-machine env demo (包括阿里云的docker server)
②运行eval
③docker-machine env --unsetx取消
docker machine 在ECS(其他云也可以)上创建Docker虚机:
(可参考https://www.jianshu.com/p/cc3bb8797d3b)
①安装Docker Machine Driver of Aliyun ECS github上可以搜到
②获得阿里云账号
Image:
①自制镜像 利用Dockerfile文件
FROM scratch 基础镜像
ADD hello /
CMD ["/hello"]
docker build -t xxx/hello-world . 构建镜像
②docker hub pull/push
docker pull image_name:version 拉取镜像
docker push 推镜像到docker hub
a:docker login
b:docker image push image_name:latest
推荐将docker hub 与 github做关联,这样只需维护github内的Dockerfile,docker hub会为我们进行build工作。
搭建私有docker hub
a:准备一台服务器,
docker run -d -p 5000:5000 --restart always --name registry registry:2 起registry
docker ps 查看是否起来
telnet ip port 查看是否能访问服务器registry进程
docker build -t ip:port/image_name . 创建待上传镜像
/etc/docker下创建daemon.json 添加{ "insecure-registries":["ip:port"] }
/lib/systemd/system/docker.service 添加 EnvironmentFile=-/etc/docker/daemon.json
sudo service docker restart
docker push ip:port/image_name 上传
docker pull ip:port/image_name 拉取
Dockerfile:docker-library(github)官方提供很多Dockerfile参考
同时Dockerfile reference官方文档也供学习
①FROM
FROM scratch 制作base image
FROM centos 使用base image
FROM ubuntu:16.04
②LABEL
LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="This is description"
③RUN:执行命令并创建新的Image Layer
RUN yum update && yum install -y vim \
python-dev 反斜线换行 &&合并命令成一行,避免无用分层
④WORKDIR
WORKDIR /test 如果没有会自动创建test目录
WORKDIR demo
RUN pwd 输出结果为/test/demo
用WORKDIR而不使用RUN cd 尽量使用绝对目录
⑤ADD and COPY
ADD hello / 后者为image的目录
ADD test.tar.gz / 添加到根目录并解压,不同于COPY
--------------------------------------------------------------------
WORKDIR /root
ADD hello test/ 结果/root/test/hello
--------------------------------------------------------------------
WORKDIR /root
COPY hello test/ 结果/root/test/hello
大部分情况,COPY优于ADD ADD还具有解压功能 二者添加本地文件
添加远程文件/目录请使用curl或者wget
⑥ENV
ENV MYSQL_VERSION 5.6 设置常量
RUN apt-get install -y mysql-server= "${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/*
使用ENV设置常量增加可维护行
⑦CMD:设置容器启动时默认执行的命令和参数
如果docker run指定了其它命令,CMD命令被忽略
docker run -it imageID /bin/bash 制定了/bin/bash命令,CMD被忽略
如果定义了多个CMD,只有最后一个会执行
命令分shell格式和exec格式
---------------------------------------------------------------
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name" #hello Docker
---------------------------------------------------------------
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"] #hello $name
改成 ["/bin/bash","-c","echo hello $name"]
--------------------------------------------------------------
CMD接收参数的例子:
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"] #可执行的程序
CMD [] #接收程序参数
启动方式 docker run -it songof/ubuntu-stress --vm 1 --verbose(后两个是可执行程序需要的参数)
⑧ENTRYPOINT:设置容器启动时运行的命令
让容器以应用程序或者服务的形式运行
不会被忽略 一定会执行 不同于CMD
最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]
Docker网络:
①linux网络命名空间
②Bridge
③容器的link
以容器test1和容器test2为例.
1、创建test1
sudo docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
2、创建test2并link test1
sudo docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"
3、容器test2内ping test1可以通,但注意反之不行。
自创建的bridge默认将其上的容器互相link.
1、sudo docker network create -d bridge my-bridge 创建自己的bridge
2、sudo docker network ls查看networks
3、brctl show 查看bridge
4、创建新的容器并指定bridge
sudo docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done"
5、sudo docker network inspect networkID 查看network内的容器
6、sudo docker network connect my-bridge test2 将已创建的test2容器接到my-bridge上
④ 容器的端口映射
以nginx容器为例:
1、sudo docker run --name web -d -p 80:80 nginx 创建nginx容器,将容器80端口映射到本地80端口(或阿里云服务器端口)
⑤host和none
⑥单机多容器复杂应用的部署:后台代码容器+redis容器
⑦多机多容器复杂应用的部署(etcd+overlay网络)
Docker持久化存储和数据共享--mysql容器的数据保存解决方案
基于本地文件系统的Volume
①docker run -d --name mysql1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
②docker run -d --name mysql2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
mysql2容器可以使用mysql1对应的volume
此外,bind mount可以实现本地目录和容器目录的一个映射。
基于plugin的Volume
Docker Compose 多容器部署解决方案
docker-compose.yml文件里配置Services(containers)、Networks、Volumes(注意使用compose file version 3)
docker-compose常用命令:
docker-compose up -d 启动yml配置的多容器
docker-compose ps 查看运行的docker-compose容器
docker-compose stop 停止容器
docker-compose down 停止并删除容器
docker-compose start 运行容器
docker-compose images 查看docker-compose对应的images
docker-compose exec serviceName bash 进入服务容器
docker-compose build 将对应的images build,若Dockerfile需要build images
wordpress配置示例:
--------------------------------------------------------------------------------------------------------------------------------------------------------
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
---------------------------------------------------------------------------------------------------------------------------------------------------------
flask-redis配置示例:
--------------------------------------------------------------------------------------------------------------------------------------------------------
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
------------------------------------------------------------------------------------------------------------------------------------------------------
水平扩展和负载均衡:
docker-compose up --scale web=3 -d web服务起三个容器
flask-redis配置示例:
---------------------------------------------------------------------------------------------------------------------------------------------------
FROM python:2.7
LABEL maintaner="Peng Xiao [email protected]"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
----------------------------------------------------------------------------------------------------------------------------------------------------
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy
links:
- web
ports:
- 8080:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
----------------------------------------------------------------------------------------------------------------------------------------------------------------