linux 的内核特性
namespace: 资源的隔离
cgroups: 资源的限制
##运行一个centos 的容器
docker run -i -t centos /bin/bash
docker 的设计目标:
提供简单的应用程序和打包工具
开发人员和运维人员职责逻辑分离
多环境保持一致性
###docker的基本组成
docker client
docker daemon
docker images
docker container
docker registry
###容器和虚拟机的对比
###docker 的应用场景
应用程序打包和发布
应用程序隔离
持续集成
部署微服务
快速搭建测试环境
提供PAAS 产品(平台即服务)
##docker 运行一个服务
docker pull nginx
docker run -it nginx
docker run --name mynginx -d nginx:latest
###docker 源 设置
[root@master01 ~]# cat /etc/docker/daemon.json
[root@master01 docker]# cat daemon.json
{"registry-mirrors":["https://c6ai9izk.mirror.aliyuncs.com","https://registry.docker-cn.com"],
"data-root":"/data/docker",
"log-driver":"json-file",
"log-opts":{"max-size":"100m"},
"storage-driver":"overlay2",
"storage-opts": [ "overlay2.override_kernel_check=true"],
"live-restore": true,
"exec-opts": [ "native.cgroupdriver=systemd" ]
}
[root@master01 docker]#
镜像与容器的关系
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history 查看镜像中各层内容及大小。
每层对应着dockerfile 中的一条指令。
docker镜像默认存储在 /var/lib/docker/中
容器其实是在镜像的最上面加了一层读写层,在运行容器里面做的任何文件改动,都会写在这个读写层。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。
docker 使用存储驱动管理镜像每层内容及可读写层的容器层。
###存储驱动
overlay2 性能最好
overlay
aufs
devicemapper
btrfs
zfs
###docker export 和docker image save 的区别
####创建容器
###创建一个容器并且后台形式运行,名字为bs
docker run -itd --name bs busybox
###进入容器
docker container attach bs
##启动一个容器
docker container start bs
###进入容器后,如果直接退出exit ,容器也会停止,如果不想停止, 用快捷键 ctrl+p+q
###创建一个容器 暴露8080端口对宿主机
docker container run -itd -p 8080:80 --name nginx01 nginx
###通过宿主机浏览器访问本机:8080 来访问nginx
可以通过logs 来查询访问情况
docker container logs -f nginx01
###另外宿主机上也能查找到日志存放的地方如下,用 容器的id 查找
/data/docker/containers/
### 设置容器重启策略 always
docker container run -itd --name nginx02 --restart=always nginx
#####docker container 限制资源使用
[root@master01 ~]# docker container run -itd --name nginx03 --memory 512m --memory-swap 1024m --cpus 4 nginx
6bb220db9d75ccea4065ef884531a7296fe641f54809b00a3cef751439148c65
[root@master01 ~]#
[root@master01 ~]#
###查看状态
[root@master01 ~]# docker container stats nginx03
####管理应用程序数据
第四章,管理应用程序数据
##Docker 主机数据挂载到容器
Docker 提供三种不同的方式将数据从宿主机上挂载到容器中:volumes ,bind mounts 和tmpfs
volumes:Docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes)
bind mounts: 可以存储在宿主机系统的任意位置
tmpfs: 挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统
volumes
###创建一个卷 查看卷信息
[root@master01 ~]# docker volume ls
DRIVER VOLUME NAME
[root@master01 ~]# docker volume create nginx-vol
nginx-vol
[root@master01 ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@master01 ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2019-10-22T13:50:34+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/data/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
###将卷挂载到 容器中
[root@master01 ~]# docker container run -itd --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
82510a15dd2d6bda7d9e7e5f56d667793e962352f411cb3a7b23c26019ab1d38
###查看挂载 信息
[root@master01 ~]# ls /data/docker/volumes/nginx-vol/_data/
50x.html index.html
[root@master01 ~]#
###删除所有容器
docker rm -f $(docker ps -q -a)
###多个容器可以一个数据卷,数据共享 提供2中挂载方式
docker container run -itd --name=nginx-test1 -p 81:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker container run -itd --name=nginx-test2 -p 82:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker container run -itd --name=nginx-test3 -p 83:80 -v nginx-vol:/usr/share/nginx/html nginx
####挂载卷可以命名卷和匿名卷 ,如果不指定卷,就会自动创建一个匿名卷
#
###bind 方式挂载到容器里面,但是这种挂载会隐藏掉容器挂载目录下面的文件
docker container run -itd --name nginx02 -p 82:80 --mount src=,dst=/usr/share/nginx/html nginx
6880e01be1c3e65898810e04a6dc05cf5c5a21870304f72099ac3d5707d137ef
##查看卷挂载
docker volume ls
[root@master01 test_volumes]# docker volume ls
DRIVER VOLUME NAME
local 7d7f748f13128d4639b5bcc3b166214a285eea51b60c90540f06a17cc9759654
local nginx-vol
docker container run -itd --name nginx01 -p 81:80 --mount type=bind,src=/opt/test_volumes/,dst=/usr/share/nginx/html/ nginx
###查看挂载信息
docker container inspect nginx01 可以查看到一下信息
"Mounts": [
{
"Type": "bind",
"Source": "/opt/test_volumes",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
###搭建lnmp 网站平台
###创建一个mysql 容器
1.自定义网络
[root@master01 ~]# docker network create lnmp
5376eaef475f958b2b149ccc3b03a4ae096cf58392836d766838851416074745
###查看network
docker network ls
2.创建mysql 数据库容器
docker container run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql --charac
ter-set-server=utf8
3.创建所需要的数据库
docker exec lnmp_mysql sh -c 'exec mysql -uroot -p123456 -e "create database wp"'
mysql: [Warning] Using a password on the command line interface can be insecure.
4.创建PHP环境容器
docker run -itd --name lnmp_web --net lnmp -p 88:80 --mount type=bind,src=/app/wwwroot/,dst=/var/www/html richarvey/nginx-php-fpm
5. 以wordpress 博客为内容
####第五章,网络管理
##网络模式
有bridge
默认网络,docker 启动后默认创建一个docker0 网桥,默认创建的容器也是添加到这网桥中。
host
容器不会获取一个独立的network namespace,而是与宿主机公用一个
none
获取独立的network namespace ,但不为容器进行任何网络配置
container
与指定的容器使用同一个network namespace ,网卡配置也是相同的
自定义
自定义网桥,默认与bridge 网络一样
###dockerfile 第六章
dockerfile 指令
build 镜像指令
构建php网站环境镜像
构建java网站环境镜像
####构建nginx 镜像
[root@master01 nginx]# cat Dockerfile
FROM centos:7
MAINTAINER www.abc.com
RUN yum install -y gcc gcc-gcc+ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp
RUN cd /tmp/nginx-1.12.1 && \
./configure --prefix=/usr/local/nginx && \
make -j 2 && \
make install
RUN rm -rf /tmp/nginx-1.12.1* && yum clean all
COPY nginx.conf /usr/local/nginx/conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]
###构建php 镜像
[root@master01 php]# cat Dockerfile
FROM centos:7
MAINTAINER www.abc.com
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libphp-devel openssl-devel
ADD php-5.6.31.tar.gz /tmp
RUN cd /tmp/php-5.6.31 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-mysql --with-mysqli \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-php-dir --with-iconv \
--enable-fpm --enable-zip --enable-mbstring && \
make -j 4 && \
make install && \
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc
RUN rm -rf /tmp/php-5.6.31* && yum clean all
WORKDIR /usr/local/php
docker build -t php:v1 . -f Dockerfile
####构建 java 镜像
FROM centos:7
MAINTAINER www.abc.com
ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45
ADD apache-tomcat-8.5.47.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.5.47/conf
RUN rm -f /usr/local/*.tar.gz
WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]
docker build -t tomcat:v1 -f Dockerfile .
###创建一个容器
docker run -dit --name=tomcat -p 8082:8080 --mount type=bind,src=/app/webapps,dst=/usr/local/apache-tomcat-8.5.47/webapps tomcat:v1
####habor 设置
###https://github.com/goharbor/harbor
公开的harbor 仓库只有下载权限没有上传权限,
私有地址,有上传和下载权限