一.镜像常用命令
命令 | 功能 | 例子 |
---|---|---|
docker images | 查看本地所有的镜像 | |
docker search mysql | 到仓库搜索镜像 | |
docker pull ubuntu:21.10 | 拉取镜像 | |
docker rmi -f 镜像id | 删除镜像 |
二.容器常用命令
命令 | 功能 | 例子 |
---|---|---|
docker run | 使用镜像新建容器并启动 | docker run -it ubuntu:21.10 |
docker start 容器id | 启动容器 | |
docker stop 容器id | 停止容器 | |
docker attach 容器id | 进入运行的容器 | |
docker exec -it 容器id /bin/bash | 进入运行的容器,并打开一个新的终端 | |
exit | 退出容器,并且容器停止 | |
docker ps | 查看正在运行的容器 | |
docker ps -a | 查看所有的容器 | |
docker rm 容器id | 删除容器 | |
docker inspect 容器id | 查看容器的基本信息 | |
docker cp 容器id:容器内路径 主机路径 | 从容器复制文件到主机 | |
docker state | 查看docker的状态,各个容器所使用的资源 |
docker run常用参数:
–name ubuntu01 容器的名字
-d 后台运行命令
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口, 例如-p 主机端口:容器端口 (通过主题的端口可以访问容器内的端口)
示例
三.容器数据卷
3.1 数据卷的含义:
- 1.把主机目录和容器内目录共享,主机目录新增数据会同步到容器内目录,反之同样也同步
- 2.实现容器间数据共享
- 3.把容器内的数据挂载到其他主机上,避免删除容器删除数据
3.2 命令
方式一:手动方式
docker run -it -v 主机目录:容器内目录 ubuntu:21.10
-v:表示目录挂载
示例:
docker run -it -v /home/ceshi:/home/contain_data ubuntu:21.10
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
补充:
-v 容器内路径 匿名挂载 (在docker的运行环境的volumes中可以看到具体共享的数据,卷的名字随机字符串)
-v 卷名:容器内路径 具名挂载 (在docker的运行环境的volumes中可以看到具体共享的数据,但是卷是有名字的)
-v /宿主机路径:容器内路径 指定路径挂载 (在宿主机上的路径上看到具体共享的数据)
方式二:在dockerfile挂载
FROM centos
VOLUME ["volume01", "volume02"]
CMD /bin/bash
上面的dockfile的意思,基于centos镜像,新建两个目录(这两个是匿名目录),然后构建自己的镜像
构建的命令
docker build -f /home/dockerfile1 -t mycentos01
然后通过mycentos01可以生成自己的容器,会看到里面有两个目录volume01 和volume02
可以通过docker inspect 查看挂载的源目录和目的目录
四.dockfile文件
功能:构建自己镜像的另一个方法,由多个命令脚本构成
指令:
命令 | 功能 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 指定制作的作者 (姓名+邮箱) |
RUN | 镜像构建时需要运行的命令 |
ADD | 添加自己的内容,比如tomcat压缩包 |
WORKDIR | 镜像的工作目录,就是新生成的容器进来后默认的路径 |
VOLUME | 设置容器数据卷 |
EXPOSE | 指定对外端口 |
CMD | 指定容器启动的时候运行的命令, 只有最后一个命令会生效,可被替代 |
ENTRYOINT | 指定容器启动的时候运行的命令,可以追加命令 |
COPY | 和ADD相似,将文件拷贝到镜像中 |
ENV | 构建时设置环境变量 |
例子1:编写一个自己的centos
新建一个dockerfile文件
FROM centos:7
MAINTAINER yxk<10234@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
使用 docker build -f dockerfile -t mycentos:0.1 .
构建进行
解释说明:
- 在centos中安装 vim 和net-tools
- 工作目录设置为 /usr/local
- 暴露端口 80
例子2:编写自己的tomcat镜像
首先准备tomcat和jdk的安装包
#tomcat运行的系统
FROM centos
COPY read.md /usr/local/read.md
#把安装包拷贝到centos对应的目录中,当执行构建的时候,压缩包会自动解压
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
#安装centos没有的命令
RUN yum -y install vim
#设置工作目录,进入容器默认的目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
#在centos中配置JAVA和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#暴露tomcat端口
EXPOSE 8080
#执行tomcat启动命令
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh
使用docker build -f dockerfile -t mytomcat .
构建镜像
使用该镜像获取的容器,将会自动运行tomcat。
五.docker网络
docker容器之间使用的是桥接技术,各个容器之间相同通信
存在的问题:
当容器重启后,对应的ip就变化了,比如我们有一个mysql的容器,另外一个容器通过ip连接mysql服务器,如果mysql容器重启后,此时就会发现连接失败
解决思路:使用自定义网络
命令 | 功能 |
---|---|
docker network ls | 查看docker所有的网络 |
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet | 创建网络 |
docker network inspect mynet | 查看网络信息 |
docker network connect mynet tomcat-other-01 | 联通不同号段间的容器 |
例子1:创建同一个号段内的容器
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
此时查看mynet网络信息,就发现上面的两个容器都在这个网络上
此时两个容器之间,既可以用ip ping通,也可以通过名称ping通
docker exec -it tomcat-net-01 ping 192.168.0.3
docker exec -it tomcat-net-01 ping tomcat-net-02
实例2:不同号段的容器网络联通
使用自定义的网络建立的容器,网络是在同一个子网内,那么对于两个网段的下的容器怎么联通?思路是一个容器可以有多个ip
docker network connect mynet tomcat-other-01
查看网络信息 docker network inspect mynet
可以发现 tomcat-other-01
在该网络中有新的ip
六.docker compose
背景
比如一个集成化的应用包含tomcat、redis、mysql、nginx,如果单独部署,就至少要docker run四次,而且不能很好的解决他们的依赖关系,compose就可以完美的解决这些问题
compose :通过yml配置文件,定义运行多个容器。
compose不是docker自带的,它是Apache开源的项目,所以你要自己安装它
命令 | 功能 |
---|---|
docker-compose up | 运行 |
docker-compose up -d | 后台运行 |
docker-compose ps | 查看运行状态 |
docker-compose stop | 停止运行 |
docker-compose restart | 重启 |
docker-compose restart service-name | 重启单个服务 |
docker-compose exec service-name sh | 进入容器命令行 |
docker-compose logs service-name | 查看容器运行log |
docker-compose.yml编写格式
version: "" #版本
services: #定义各个服务
服务1: #生成服务的镜像 可以是仓库中的,也可以是自己本地定义的dockerfile,当然可以直接在这里手写dockerfile中的命令或者docker命令
生成该容器对应的参数
depends_on: #服务依赖其他服务
- 服务n
- 服务n-1
服务n:
生成该容器对应的参数
#其他的配置
备注:多看官网的例子