1.docker的感念,docker是什么
docker 分为三种感念:镜像 容器 仓库
镜像:类似于一个模板,里面包含了一些内容
容器:容器是一个镜像的实例,如果理解镜像为一个 class,那么容器就被理解为是 new class(); 是镜像的实例
仓库:就是下载镜像资源的地方。
docker 容器不是虚拟机,容器可以说是一个进程,我们可以给容器分配内存。就像windows安装了虚拟机,可以给虚拟机分配内存大小,磁盘空间。
2.docker基础命令
搜索镜像,从maven仓库中查询
docker search mysql
列出当前系统存在的镜像
docker images
给镜像更换名称
docker tag imageId repository:tag
删除镜像(-f 强制) 必须知道镜像的 imageId
docker rmi -f imageId
repository:tag(镜像的仓库源:镜像的标签) 拉取
docker pull repository:tag
运行一个容器
docker run -it -d --name "xxx" -p port1:port2 -p port3:port4 repository:tag -v home/data:/data
docker run -> 运行一个容器
-i -> 交互
-t -> 终端,-it 会运行 jar 或其他应用的时候 查看他们的启动信息
-d -> 后台运行
-p -> 端口映射 port1(代表物理机) port2(代表容器) 容器的端口是可以重复的,所以容器和物理机的端口可以一致。rabbitmq有两个端口5672和15672 所以会用到双 -p
repository:tag -> 如果不指定tag,默认使用最新的
启动成功之后,会有一个运行的容器id
--name "xxx" -> 指定容器名称
-v /home/data:/data -> /home/data(宿主机):/data(容器) 本地地址和容器地址产生挂载关系, 在容器内部该目录下,或者宿主机内部该目录下,修改文件、创建文件,彼此都会同步修改
查看运行的容器
docker ps
查看所有状态的容器
docker ps -a
检查容器内部信息
docker inspect 容器名称|容器前12位id
停止容器
docker stop 容器名称|容器前12位id
开启容器运行
docker start 容器名称
删除容器之前必须先停止容器运行
docker rm 容器名称
查看容器日志
dokcer logs -f 容器id
进入容器内部
docker exec -it mysql bash # 进入mysql内部
mysql -uroot -p123456 # 登录mysql服务 注意这里mysql -uroot -p123456 是连起来的
把一个容器制作为一个新的镜像
docker commit
-m="提交信息"
-a="作者"
容器id
自定义镜像名称:[自定义标签名]
查看容器的信息
docker inspect 容器ID
对于没有私有仓库的要使服务器间共享一个docker镜像,可以先把某台机器上的进行先导出,然后其他服务器在导入即可
# 导出
docker save
镜像ID
-o /本地路径/文件.tar 这句话意思导出到你宿主机的一个地址,文件名随便起后缀为tar,路径要提前建好
# 导入
docker load < /上传文件的地址/导出的文件名.tar
# 查看导入的镜像
docker images
容器之间共享,容器2 共用 容器1
docker tun -it
-- name 容器2
--volumes-from 容器1(容器1必须已启动)
镜像名称
查看制作镜像时叠加其他镜像的操作
docker history 镜像ID
3.修改已经存在容器的端口
1、停止容器(docker stop d00254ce3af7)
2、停止docker服务(systemctl stop docker)
3、修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果config.v2.json里面也记录了端口,也要修改)
cd /var/lib/docker/containers/d00254ce3af7* #这里是CONTAINER ID
vim hostconfig.json
如果之前没有端口映射, 应该有这样的一段:
"PortBindings":{}
增加一个映射, 这样写:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"60000"}]}
前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口
4、启动docker服务(systemctl start docker)
5、启动容器(docker start d00254ce3af7)
4.制作镜像的基本命令
概念
Dockerfile 默认会把当前所在文件的上下问都发送给 Docker Server,最终制作成一个镜像,比如你得 DockerFile 在 linux的根(/)目录,那么就会递归根目录下的所有文件,发送到 Docker Server 制作镜像,所以制作 Dockerfile 最好是在某一个地方新建文件夹去制作。制作过程都是依赖于一个个的镜像,所以会有缓存加速下次制作,如果不需要依赖缓存 可以在命令制作的最后面加 --no-cache
.dockerIgnore 是用来忽略哪些文件或目录不参与到制作镜像中
制作命令:docker build -f /home/docker/nginx/Dockerfile .
-f 用来指定 Dockerfile 所在的位置,一般会使用 docker build -t nginx2 .
-t 在当前目录制作镜像,nginx2
镜像的名字,.
代表 Dockerfile 就在当前目录
命令
指令 | 描述 |
---|---|
FROM | 构建的新镜像是基于哪个镜像。例如:FROM centos:6,第一个指令必须是FROM |
MAINTAINER | 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen |
RUN | 构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"] 也可以直接 RUN yum install httpd |
或者RUN yum install httpd | |
CMD | 容器运行时执行的Shell命令 (编写的dockerfile中多个cmd都会执行,但默认保留最后一个命令,如果 docker run 运行时传递command,会覆盖cmd的保留命令),启动容器会执行CMD的保留命令。例如:CMD ["-c","/start.sh"] 也可以是 CMD echo 'hello docker' |
或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D | |
EXPOSE | 声明容器运行的服务端口。例如:EXPOSE 80 443,但是默认都是 tcp 协议,如果想要暴漏udp 协议,则是 EXPOSE 80/udp ,注意只能是tcp或udp |
ENV | 设置容器内的环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包 |
例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html | |
或者:ADD html.tar.gz /var/www/html | |
COPY | 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh |
ENTRYPOINT | 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖),比CMD牛皮一些。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"] |
或者ENTRYPOINT /bin/bash -c "/start.sh" | |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其他容器 |
例如:VOLUME ["/var/lib/mysql"] | |
USER | 为RUN,CMD和ENTRYPOINT执行命令指定运行用户 |
例如:USER Mr_chen | |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
例如:WORKDIR /data | |
HEALTHCHECK | 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3 |
CMD curl -f http://localhost/ exit 1 | |
ARG | 在构建镜像时指定一些参数。例如:ARG user |
ONBUILD | 当镜像被继承后触发在 ONBUILD 里写的命令,继承者直接使用 FROM 命令继承当前镜像的名称即可,在 build 的时候触发 |
简单镜像制作
编写 dockerfile
#volume test
# FROM 下载
FROM centos
# 在根目录下新建两个目录,该文件会默挂载到宿主机的某个目录下,对此的创建文件删除等都会同步,
# 可以通过 docker inspect 容器ID 来查看对应的文件地址
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
# 输出一句成功
CMD echo "finished,-------------success1"
CMD /bin/bash
编译
docker build
-f dockerfile的文件路径
-t 命名空间/镜像名称(如:test/centos),整体也可以理解为镜像名称
. 点代表当前目录
运行
docker run -it 镜像名称
如果出现 cannot open directory .: Permission denied 在运行的时候 --Privileged=true
docker run -it 镜像名称 --Privileged=true
docker 构建nginx镜像
#首先开启ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = 1
#创建nginx的镜像目录
mkdir -p dockerfile/lib/centos/nginx
cd dockerfile/lib/centos/nginx
#准备Dockerfile文件
vim Dockerfile
FROM centos:7 #构建的新镜像是基于哪个镜像(构建的nginx是基于centos7构建的,依赖centos7的系统支持,如果没有镜像自动下载)
MAINTAINER wk #镜像制作人
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel #构建镜像时运行shell命令,yum安装nginx的依赖包
ADD nginx-1.12.1.tar.gz /tmp #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩
RUN cd /tmp/nginx-1.12.1 && \ #运行shell命令编译安装nginx,make -j 给与2个线程编译
./configure --prefix=/usr/local/nginx && \
make -j 2 && \
make install
RUN rm -rf /tmp/nginx-1.12.1* && yum clean all #删除nginx源码包和清空yum缓存,使容器最轻量化
COPY nginx.conf /usr/local/nginx/conf #拷贝文件或目录到镜像
WORKDIR /usr/local/nginx #为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
EXPOSE 80 #声明容器的端口号
CMD ["./sbin/nginx", "-g", "daemon off;"] #运行容器时执行的shell命令 -g daemon off 不以守护进程的方式开启nginx,即不以后台运行的方式开启nginx
#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
ls
Dockerfile nginx-1.12.1.tar.gz nginx.conf
#build基于nginx的docker镜像
docker build -t nginx:1 .
docker 构建java环境
#创建java镜像构建存储目录
mkdir -p dockerfile/lib/centos/tomcat
cd dockerfile/lib/centos/tomcat
#将所需软件包拷贝到当前目录下
ls
apache-tomcat-8.0.46.tar.gz Dockerfile jdk-8u45-linux-x64.tar.gz server.xml
#筹备Dockerfile
vim Dockerfile
FROM centos:7
MAINTAINER wk
ADD jdk-8u45-linux-x64.tar.gz /usr/local #创建javaJDK环境
ENV JAVA_HOME /usr/local/jdk1.8.0_45 #强行生成一个环境变量
ADD apache-tomcat-8.0.46.tar.gz /usr/local #解压tomcat
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf #复制配置文件
RUN rm -f /usr/local/*.tar.gz #删除安装包 容器轻量化
WORKDIR /usr/local/apache-tomcat-8.0.46 #工作目录 进入容器所在的目录
EXPOSE 8080 #映射端口
ENTRYPOINT ["./bin/catalina.sh", "run"] #用catalina。sh run前台启动tomcat
#build基于tomcat的镜像
docker build -t tomcat:1 .
#创建网页挂载目录
mkdir -p /app
#启动tomcat的容器进程
docker run -dit --name=tomcat -p 8080:8080 --network lnmp --mount type=bind,src=/app/,dst=/usr/local/apache-tomcat-8.0.46/webapps tomcat:1
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15eca19688ca tomcat:1 "./bin/catalina.sh r…" 17 seconds ago Up 16 seconds 0.0.0.0:8080->8080/tcp tomcat
7ce4d14cf756 nginx:1 "./sbin/nginx -g 'da…" 2 hours ago Up About an hour 0.0.0.0:8888->80/tcp lnmp-nginx
5b49fc160f9e php:1 "./sbin/php-fpm -c /…" 2 hours ago Up About an hour 9000/tcp lnmp_php
#创建网站测试页
mkdir /app/ROOT
vim /app/ROOT/index.html
ddddddddddddddddddd
Docker 使用阿里云仓库或自建仓库
阿里云仓库
- 先登录阿里云镜像服务,地址
- 创建个人或企业实例
- 创建镜像仓库,这个仓库可以建多个,看自己
- 创建完毕之后可以根据阿里云提供的步骤进行推送或拉取
如果我们只是想用阿里云的镜像加速器,可以找到如下图操作即可。
自建仓库
- 拉取仓库镜像
docker pull registry
- 运行镜像
docker run -d -v /edc/images/registry:/var/lib/registry
-p 5000:5000
--restart=always
--name xdp-registry registry
- 查看镜像信息
curl http://127.0.0.1:5000/v2/_catalog