一、Docker镜像
1.1 什么是Docker镜像
-
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
-
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的
1.2 Docker镜像的分层
- Dockerfile的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当dockerfile指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效。
- 某一层的镜像缓存失效之后,它之后的镜像缓存都会失效
- 镜像层是不可改变的,如果在某一层中添加了一个文件,然后在下一层中删除它,则镜像中依然会包含该文件。
- 镜像 Dockfile生成 。 镜像分层,自下而上制作镜像
层数 | 关键词 |
---|---|
第一层 | FROM ubuntu:14.04 基于一个基础镜像,服务基于这个基础镜像之上 |
第二层 | ADD run.sh/ 指定一个脚本(在宿主上写,写完拷贝到容器) |
第三层 | VOLUME /data 挂载宿主共享空间 |
第四层 | CMD ["./run.sh"] 定义启动容器时执行哪一条指令 |
1.3 Docker镜像创建的三种方式
- 基于已有镜像的创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器ID/名称 仓库名称:[标签]
-m 说明信息
-a 作者信息
-p 生成过程中停止容器的运行
- 基于本地模板创建‘
通过导入操作系统模板文件生成新的镜像
使用wget命令导入为本地镜像
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz ## 下载模板文件
[root@docker opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke new 487145d2411f 8 seconds ago 215MB
- 基于Dockerfile创建
Dockerfile 是由一组指令组成的文件
Dockerfile结构文件
基础镜像文件
维护者信息
镜像操作指令
容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号 开头的注释
Dockerfile
指令 | 含义 |
---|---|
FROM | 镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像执行命令,并提交到新的镜像中 |
CMD [ “要运行的程序”,“参数1”,“参数2”] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
VOLUME [“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
二、dockerfile容器的构建
2.1 dockerfile 构建ssh
FROM centos:7
MAINTAINER this is wang CentOS Project
RUN yum -y update
RUN yum -y install openssh* net-tools losf telnet passwd
RUN echo '123456' | passwd -stdin root
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/s^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
[root@localhost sshd]# docker build -t sshd:new .
[root@localhost sshd]# docker run -d -P sshd:new
[root@localhost sshd]# docker run -d -P sshd:new
2dd22ce391862097ba3539e8460fb3abfba8ac0c031dea4700dc833abfa99ede
[root@localhost sshd]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2dd22ce39186 sshd:new "/usr/sbin/sshd -D" 17 seconds ago Up 17 seconds 0.0.0.0:32768->22/tcp loving_wing
[root@localhost sshd]# ssh localhost -p 32768
The authenticity of host '[localhost]:32768 ([::1]:32768)' can't be established.
RSA key fingerprint is SHA256:L/TLtYtX7BcjlVOc+cVl63pPJXxZhQpP2+363tFvwC0.
RSA key fingerprint is MD5:c2:58:df:b8:a6:e8:4c:cc:7b:9e:e2:10:f9:72:4c:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:32768' (RSA) to the list of known hosts.
root@localhost's password:
2.2 dockerfile 构建systemctl服务
FROM sshd:new
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/;for i in *;do [ $i == \systemd-tmpfiles-setup.service ] || rm -f $i; done);\
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD [ "/usr/sbin/init" ]
[root@localhost systemctl]# docker build -t systemd:new .
[root@localhost systemctl]# docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:new /sbin/init &
[1] 4229
[root@localhost systemctl]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54c259dccde0 systemd:new "/sbin/init" 27 seconds ago Up 26 seconds 22/tcp amazing_goldstine
[root@localhost systemctl]# docker exec -it 54c259dccde0 bash
[root@54c259dccde0 /]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:sshd(8)
man:sshd_config(5)
[root@54c259dccde0 /]# systemctl start sshd
2.3 dockerfile 构架nginx服务
ADD 既负责把压缩包复制到容器中,还负责解压压缩包
[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# vim Dockerfile
FROM systemd:new
MAINTAINER this is syystemctl + nginx
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.2
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@localhost nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@localhost nginx]# docker build -t nginx:new .
docker run -d -p nginx:new
2.4 dockerfile 构建Tomcat
Tomcat CMD 命令起不来 要用ENTRYPOINT 才起得来
[root@localhost ~]# mkdir tomcat
[root@localhost ~]# cd tomcat/
FROM centos:7
MAINTAINER this is tomcat
ADD jdk-8u91-linux-x64.tar.gz /usr/local
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
ADD apache-tomcat-9.0.16.tar.gz /usr/local
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat8
EXPOSE 8080
#CMD [ "/usr/local/tomcat8/bin/catalina.sh","run"]
ENTRYPOINT [ "/usr/local/tomcat8/bin/catalina.sh","run"]
~
[root@localhost tomcat]# docker build -t tomcat:centos .
[root@localhost tomcat]# docker run -d --name tomcat01 -p 1234:8080 tomcat:centos
2.5 dockerfile 构建mysql
5:mysql容器(手工编译)
【构建MySQL镜像】
mkdir mysqld
cd mysqld
vim my.cnf
[client]
port=3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
[mysql]
port=3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
character_set_server=utf8
pid-file=/usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
server-id=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
vim Dockerfile
FROM centos:7
MAINTAINER This is MySQL
RUN yum -y install \
ncurses \
ncurses-devel \
bison \
cmake \
make \
gcc \
gcc-c++
RUN useradd -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make && make install
RUN chown -R mysql:mysql /usr/local/mysql/
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
RUN echo -e "#!/bin/bash \nsystemctl enable mysqld" > /run.sh
RUN chmod 755 /run.sh
RUN sh /run.sh
CMD ["init"]
docker build -t mysql:centos .
docker run --name=mysql_server -d -P --privileged mysql:centos
docker exec -it xxxxxxxx bash
grant all privileges on *.* to 'root'@'%' identified by '123456';
安装 MariaDB
[root@localhost mysqld]# yum -y install mariadb mariadb-server
[root@localhost mysqld]# systemctl start mariadb
mysql -h 192.168.233.100 -uroot -P 32768 -p123456