1Docker
1.1start docker
yum install docker
docker -v //docker版本
docker info - high level
docker inspect - low level
systemctl start docker //启动docker, systemctl=service+chkconfig
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker //开机启动...
1.2docker命令
docker images //列出本地镜像
docker search mysql //搜索远程镜像
docker pull centos:7 //pull镜像
docker pull zookeeper
docker pull httpd
docker images -q //所有的镜像id
docker push //推送镜像
docker ps //**正在运行的容器
docker ps -a //全部容器
docker ps -l //最新的容器
docker ps -f status=exited //停止的容器,都小写
docker ps -f status=created
docker ps -n 5 //最新5个container
相对应的有:
docker node ps -f "label=usage"
docker service ps -f 'desired-state=running' dit_ui-homepage
docker service ps -q dit1_ui-homepage //-q或--quiet //only display task(也叫service) IDs
docker service ps --quite dit1_ui-homepage
1.3运行容器
docker run //创建并运行容器, -i表示运行容器;-t表示容器启动后会进入命令行;-d表示detached, 后台运行;-t和-d刚好相反
docker run -id --name=pinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql //如果没有相应镜像会自动下载 -e:环境变量...
docker run -id --name=mycentos3 -v /usr/local/myhtml:/usr/local/mh --privileged=true centos:7 //运行容器并顺带映射--宿主机目录:容器目录 //--privileged=true 容器获得宿主机的权限
-v //在宿主机上修改,然后共享到容器上...
exit: 退出容器
docker run -it --name=mycentos centos:7 /bin/bash //bin/bash是用来交互的,前台运行需要加上... //即使关闭的容器也不能重名
1.4查看后台运行的容器
//查看必须是-it 且加上交互/bin/bash
docker exec -it mycentos3 /bin/bash //或
docker exec -it mycentos3 /bash //或
docker exec -it mycentos3 sh
docker inspect 容器名 //外面不能访问ip,只能通过端口映射来访问容器,因为容器ip在不同的网段...
容器的停止: 用run创建后的容器都可以启动和停止
docker stop 容器名 //不是docker的停止
1.5文件拷贝
docker cp testFile testCentos:/usr/local //容器间的拷贝是不允许的... //echo 123 > testFile
//容器停止再启动,拷贝的文件还在那吗?还有,如果容器是以service的形式启动的呢?
可以重新启动...(容器不能重名,所以restart还是原来的容器,东西也不会丢失)
docker rm 容器名 //区别于docker rmi image名,如果image有容器在运行就没法删除...
1.6文件挂载(文件映射)
宿主机:容器
1.7将容器保存为镜像
这样配置好的容器就可以迁移...
docker commit...
将镜像保存为文件
docker save -o myfile.tar myimage
恢复
docker load -i myfile.tar
sudo docker system prune --volumes -af && sudo docker image prune -af
2Docker Swarm
Swarm: stack一组服务编排的使用;service一个应用的抽象;task一个容器;
2.1docker node
docker node ls //List nodes in the swarm 查看docker swarm中各个节点的状况;
hostname manager //重命名
docker node inspect --pretty worker02
docker node ps self //This command works with the Swarm
orchestrator //List tasks running on one or more nodes, defaults to
current node
docker node ps -f "label=usage"
docker node update --help //availability string drain就是排除
docker node update --availability drain manager //manager节点不跑service
2.2docker service
docker service --help //查询所有相关命令
Docker service create --replicas 1 --name hello busybox ping google.com //创建服务
Docker service create --replicas 1 --name hello 8080:80 busybox ping google.com //创建服务并映射端口
docker service ls //list services
docker service ps hello
docker service update --args 'ping www.google.com' hello //更新现有service的配置...
docker service ps my_web //用docker ps -a 是能够看到这些容器的(只能查看到本节点的service)
docker service ps -f 'desired-state=running' service名 //查看service所在的节点
[online@master ~]$ docker service ps perf_service-sitesettings //可以在manager上查看到service所在的节点
docker ps | grep 容器名: docker ps | grep cms
docker service inspect --pretty my_web //清晰查看
把镜像从3.0.6更新到3.0.7(从创建时的镜像更新到新镜像...)
docker service update --publish-add 30094:4055 my_web //更新服务
Docker service update --image nginx:1.12 nginx_test //更新服务
Docker service scale my_web=2 //扩容,创建的时候用--replicas 1,扩容用scale
//other cases
Docker service create --replicas 1 --name uat_service-price xxxx:xx registry.online.xxx.com/ecomm/service.price:uat //never tried this, better use yml file
docker service update --image registry.online.kungnect.com/ecomm/service.caas:uat uat_service-caas
docker service update --image registry.online.xxx.com/ecomm/service.localization:prod prod_service-localization //更新服务的一些相关配置...
//查看或删除特定的service
docker ps | grep service-name
docker service stop service-name //错误,没有docker service stop, but you can try docker service rm
docker service rm 4orr7bof323w //kill or remove service
docker service scale service-name=0 //跟portainer的scale相对应
docker service rm service-name //跟portainer的remove相对应
docker service rm ... //跟portainer里的操作一样的...
回滚策略:
[root@localhost ~]# docker service create \
> --name my_web4 \
> --replicas 10 \
> --update-delay 10s \
> --update-parallelism 2 \
> --update-failure-action continue \
> nginx
docker service update --rollback my_web4 //手动回滚
2.3docker build
docker build -t 192.168.0.210:5000/nginx:v1 . //192.168.0.210:5000是私有仓库
2.4docker push
2.5docker swarm init
2.6docker stack deploy
docker stack deploy -c app.yml.cms2 uat //基于yml创建和更新服务,即docker service create & docker service update
python ./script/haproxy.py //更新proxy文件
2.7dockerfile和yml文件的区别
2.7.1dockerfile用来创建镜像
Container 转成Image(不推荐),比如docker commit 容器名 镜像名
docker build的方式也就是通过Dockfile的方式(推荐),比如docker build -t 仓库/centos-vim-new .
2.7.2yml用来创建服务service
yml - 创建服务cms-a / cms-b / cms-c
service:nginx:image: 192.168.0.210:5000/nginx:v1
2.8docker container和docker swarm service
swarm service只能通过manager node控制和管理,docker container由docker daemon进行控制和管理
而且从实践看来,每个service都是一个container,比如:
在portainer停止一个service后,特别是replicas=1的service,你就能看到相应的container也停止了;
如果service的replicas=2, 肯定会有相应的2个container,从这个意思上讲,service和container的关系是1:n
3脚本
3.1
sh -c"while true;do curl 127.0.0.1:8080&&sleep 1;done"
4实战
[root@localhost ~]# ln -s /opt/apache-maven-3.5.3/ /opt/apache-maven
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker images