Docker基本使用
配置阿里云镜像加速
编辑vi /etc/docker/daemon.json
{"registry-mirrors": ["https://5xok66d4.mirror.aliyuncs.com"] }
重启systemctl daemon-reload && systemctl restart docker
搜索docker镜像
查看本地镜像
docker images
搜索镜像
docker search centos
搜索镜像并过滤是官方的
docker search --fifilter "is-offiffifficial=true" centos
搜索镜像并过滤大于多少颗星星的:
docker search --fifilter stars=10 centos
下载centos7镜像:
docker pull centos:7
修改本地镜像名字(小写)
docker tag centos:7 mycentos:1
本地镜像的删除:
docker rmi centos:7
docker容器的构建、查看、停止、重启
构建容器:
docker run -itd --name=mycentos centos:7
- -i :表示以交互模式运行容器(让容器的标准输入保持打开)
- -d:表示后台运行容器,并返回容器ID
- -t:为容器重新分配一个伪输入终端
- –name:为容器指定名称
查看本地所有的容器:
docker ps -a
查看本地正在运行的容器:
docker ps
停止容器:
docker stop CONTAINER_ID / CONTAINER_NAME
一次性停止所有容器:
docker stop $(docker ps -a -q)
启动容器:
docker start CONTAINER_ID / CONTAINER_NAME
重启容器:
docker restart CONTAINER_ID / CONTAINER_NAME
删除容器:
docker rm CONTAINER_ID / CONTAINER_NAME
强制删除容器:
docker rmi -f CONTAINER_ID / CONTAINER_NAME
查看容器详细信息:
docker inspect CONTAINER_ID / CONTAINER_NAME
进入容器:
docker exec -it 0ad5d7b2c3a4 /bin/bash
Docker容器与宿主机的文件复制与挂载
从宿主机复制到容器:
docker cp 宿主机本地路径 容器名字/ID:容器路径
docker cp /root/123.txt mycentos:/home/
从容器复制到宿主机:
docker cp 容器名字/ID:容器路径 宿主机本地路径
docker cp mycentos:/home/456.txt /root
宿主机文件夹挂载到容器里:
docker run -itd -v 宿主机路径:容器路径 镜像ID
docker run -itd -v /root/xdclass/:/home centos:7
构建自定义docker镜像
1.Docker Commit构建自定义镜像
docker commit 4eb9d14ebb18 mycentos:7
或
docker commit -a "XD" -m "mkdir /home/xdclass" 4eb9d14ebb18 mcentos:7
-a:标注作者
-m:说明注释
2.Dockerfile构建自定义镜像
- Dockerfile
# this is a dockerfile
FROM centos:7
MAINTAINER hui 2303058491@qq.com
RUN echo "正在构建镜像"
WORKDIR /home/xdclass
COPY 2303.txt /home/test
RUN yum install -y net-tools
- 构建
docker build -t mycentos:v2 .
- 查看:
docker images
Docker镜像分层结构
- 总结
- 共享资源
- 对容器的任何改动都是发生在容器层
- 容器层是可写可读,而镜像层只读
Dockerfile基础指令
FROM 基于哪个镜像、
MAINTAINER 注明作者
COPY 复制文件进入镜像(只能用相对路径,不能用绝对路径)
ADD 复制文件进入镜像(假如文件是.tar.gz文件会解压,sql文件会执行)
WORKDIR 指定工作目录,假如路径不存在会创建路径
ENV 设置环境变量
EXPOSE 暴露容器端口
RUN 在构建镜像的时候执行,作用于镜像层面
ENTRYPOINT 容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
CMD
在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
容器启动后执行默认的命令或者参数,允许被修改
命令格式:
- shell命令格式:RUN yum install -y net-tools
- exec命令格式:RUN [ "yum","install" ,"-y" ,"net-tools"]
Dockerfile构建java环境
- Docker file
FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
- 制作java镜像
docker build -t mycentos:java .
- 启动容器
docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT mycentos:jdk /bin/bash
Dockerfile构建nginx镜像
- Docker file
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local COPY nginx_install.sh /usr/local RUN sh /usr/local/nginx_install.sh EXPOSE 80
- nginx_install.sh
#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install
- 制作nginx镜像
docker build -t mycentos:nginx .
nginx镜像启动注意
在容器里nginx是以daemon方式启动,退出容器时,nginx程序也会随着停止:
/usr/local/nginx/sbin/nginx
使用前台方式永久运行:
/usr/local/nginx/sbin/nginx -g "daemon off;"
启动nginx镜像
docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
Docker网络模式
默认的三种网络模式
docker network ls 查看容器网络模式 - bridge:桥接模式 - host:主机模式 //使用主机端口 - none:无网络模式 //无法连接外网
Docker容器Link实现单向通信
启动mysql数据库容器:
docker run --name mydb -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
启动tomcat应用容器并link到mysql数据库:
docker run -itd --name tomcat1 --link mydb tomcat:tag #mydb容器一定要存在
官方版的mysql5.7需要安装工具才能有ping命令
apt-get update && apt-get install iputils-ping
Docker容器bridge网桥实现双向通信
创建一个新的网桥: docker network create -d bridge my_bridge
启动第一个容器: docker run -itd --name tomcat centos:7
启动第二个容器: docker run -itd --name redis centos:7
把第一个容器加入网桥: docker network connect my_bridge tomcat
把第二个容器加入网桥: docker network connect my_bridge redis
最后分别进入俩个容器中进行验证
- Docker容器的特权模式
- 可以删除网关….
Docker Volume数据共享
- dockerfile
FROM centos:7
VOLUME ["/usr/local"]
注意:在dockerfile里设置volume是无法修改宿主机的挂载路径的
使用volume容器共享创建nginx集群
使用–volumes-from 实现容器与容器之间volume共享
创建nginx1
docker run -itd -p 8080:80 -v /usr/local/nginx/html:/usr/local/nginx/html –name nginx1
mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
创建nginx2
docker run -itd -p 8081:80 –volumes-from nginx1 –name nginx2 mycentos:nginx
/usr/local/nginx/sbin/nginx -g “daemon off;”
创建nginx3
docker run -itd -p 8082:80 –volumes-from nginx1 –name nginx3 mycentos:nginx
/usr/local/nginx/sbin/nginx -g “daemon off;”
Docker-Compose使用
一个简单的dock er-compose.yml
version: '3' services: redis: image: mycentos:redis
compose操作容器(一定要进入配置文件目录)
- 后台启动容器:
docker-compose up -d
- 查看容器运行情况:
docker-compose ps
- 停止并删除容器:
docker-compose down
- 停止并删除容器并删除
volume:docker-compose down --volumes
- 停止启动容器:
docker-compose stop;docker-compose start
- docker-compose exec的使用:
docker-compose exec redis bash
- 后台启动容器:
总结:
- 操作docker-compose一定要在配置文件docker-compose.yml文件路径下操作 格式一定要注意,该空格要空格
docker-compose 基本使用
docker-compose.yml的三大部分:version,services,networks,最关键是services和networks两个部分 compose设置网络模式
compose使用端口映射
compose设置文件共享
compose管理多个容器
docker-compose.yml
version: '3.3' services:
db:
image: mysql:5.7 volumes:
- db_data:/var/lib/mysql
自定义,必须与下面对应)
restart: always
environment:
#docker run -itd mysql:5.7
#采用的是卷标的形式挂载(注意:- db_data是参数,可以变,
#自动重启,保证服务在线
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_ROOT_PASSWORD= somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
#指定环境变量 docker -itd -e
- db # - db 是参数,合起来的意思是只有当上面的mysql数据库安装成功后,这个wordpress才可以 被安装,还有一个功能,就是docker --link 将上面的mysql数据库,与这个wordpress应用连起来
image: wordpress:latest
ports:
- 8000:80 restart: always environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
docker-compose中有两种方式可以设置volumes
- 使用具体路径直接挂载到本地,特点就是直观
- 使用卷标的形式,特点就是简洁,但是不知道数据到底在本地的什么位置。需要通过卷标查看
docker volume ls
docker volume inspect wordpress_db_data
update users set password='$2b$10$PhyKg3QCeZ9FsmwU9GnHoOZf7FbhFIJM9XaeTZ2nx8UWbvoq5EcRG' where id = 1;
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!