1.什么是容器?
容器是由应用程序本身和它的环境依赖(库和其他应用程序)两部分组成,并在宿主机(Host)操作系统的用户空间中运行,但与操作系统的其他进程相互隔离.即:容器就是在隔离的环境运行的一个进程
docker 的优点
1.缩减部署过程及可移植性
2.环境标准化
3.软件升级及版本控制
4.隔离性
2.docker 需要隔离的6种名称空间(namespace)
1.UTS主机和域名
2.Mount挂载点(文件系统)
3.IPC信号量\消息队列和共享内容
4.PID进程编号
5.User用户和用户组
6.Net网络设备\网络栈\端口号等
3.docker-ce 的安装
第一步:下载 docker-ce
cd /etc/yum.repos.d/
wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
vim docker-ce.repo
:%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@
yum install -y docker-ce
第二步:配置加速器
mkdir /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://765v3tj7.mirror.aliyuncs.com"]
}
第三步:启动 docker 程序
systemctl restart docker.service
systemctl enable docker.service
验证
docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
4.docker 镜像常用命令
docker search 搜索镜像,优先选官方,stars数量多
docker pull 拉取镜像(下载镜像),注意版本
docker push 推送镜像(上传镜像)
docker load 导入镜像
例子: docker load -i docker_nginx.tar.gz
docker save 导出镜像
例子:docker save centos:7 -o docker_centos7.tar.gz
docker image ls 查看镜像列表
docker rmi 删除镜像
docker tag 给镜像打标签
5.docker 容器常用命令
docker run 创建并启动容器
例子:docker run -d -it -p 80:80 nginx:latest
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker ps 查看容器列表 -a 查看所有容器
docker rm 删除容器
批量删除所有容器: docker rm -f `docker ps -a -q`
docker exec 进入正在运行的容器(分配一个新终端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
docker attach 进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q
docker commit 从容器创建一个新的镜像
例子: docker commit 容器id 镜像名字:版本
注意:
容器想要放在后台一直运行的化,那么容器的初始命令,必须前台运行,否则容器就会退出.
6.docker 端口映射
docker run
-p 宿主机端口:容器端口
-p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口)
-p 宿主机ip1::容器端口 随机端口映射
-p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射
-p 80:80 -p 3306:3306
-p 1111-1119:1111-1119 端口范围映射
-P 自动随机端口映射
7.docker 数据卷
docker run
-v 宿主机绝对目录:容器目录
-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据
-v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据
--volumes-from 跟某一个容器挂载所有相同的卷
8.练习: 只启动一个 nginx 容器
方法一:
docker run -d -p 80-81:80-81 -v /test:/test nginx:latest
dodck ps -a
docker exec -it vigorous_nobel /bin/bash
echo '
server{
listen 81;
server_name localhost;
location / {
root /test;
index index.html index.htm;
}
}' > /etc/nginx/conf.d/test.conf
exec
docker restart vigorous_nobel
方法二:
docker run -d -p 82-83:80-81 -v /test:/test nginx:latest
vim test.conf
server{
listen 81;
server_name localhost;
location / {
root /test;
index index.html index.htm;
}
}
docker cp test.conf 1448ded327d2:/etc/nginx/conf.d
docker restart condescending_colden
方法三:
vim test.conf
server{
listen 81;
server_name localhost;
location / {
root /test;
index index.html index.htm;
}
}
docker run -d -p 04-05:00-01 -v /test:/test -v /root/test:/etc/nginx/conf.d/test.conf nginx:latest
9.手动制作 docker 镜像
制作一个基于 centos6 系统的nginx镜像(单服务)
第一步:启动一个纯净的容器,在容器中安装服务
docker run -it -p 80:80 centos:6.9 /bin/bash
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install -y nginx
exit
第二步:把安装好服务的容器提交为镜像
docker commit 507fe98fc330 centos6.9_nginx:v1
第三步:测试 docker run
docker run -d -p 81:80 centos6.9_nginx:v1 nginx -g 'daemon off;'
制作一个 nginx+sshd 双服务镜像
第一步:启动一个基础环境的容器, 在容器中安装服务
docker run -it -p 88:80 -p 1022:22 centos6.9_nginx:v1 /bin/bash
yum install -y openssh-server
service sshd restart
echo '123456' | passwd --stdin root
vi /init.sh
#!/bin/bash
# 启动ssh服务
/usr/sbin/sshd
# 启动nginx服务
nginx -g 'daemon off;'
chmod +x /init.sh
exit
第二步:把安装好服务的容器提交为镜像
docker commit 43fc313c3caf centos6.9_nginx_ssh:v1
第三步:测试 docker run
docker run -d -p 90:80 -p 1024:22 centos6.9_nginx_ssh:v1 /bin/bash /init.sh
10.dockerfile 自动制作镜像
自动构建 docker 镜像的需要一个 dockerfile 文件, 一个镜像一个 dockfile 文件.
常用指令
FROM 基础镜像
RUN 制作镜像过程中需要的执行命令(安装服务)
CMD 容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和 ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD 把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY 把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR 指定容器的默认工作目录
EXPOSE 镜像要暴露的端口
VOLUME 持久化卷
ENV 环境变量(ssh的密码,数据库的密码)
LABEL 镜像的属性标签
MAINTAINER 管理者标识
根据 dockerfile 自动构建镜像的思路
a: 手动制作docker镜像,记录历史命令
b: 根据历史命令编写dockerfile文件
c: docker build构建docker镜像
d: 测试镜像的功能
dockerfile 基于 centos6 系统的nginx镜像
FROM centos:6.9
RUN echo '192.168.19.200 mirrors.aliyun.com' >>/etc/hosts
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
docker build -t centos_nginx:v1
centos7安装mysql5.6
FROM daocloud.io/library/centos:7
RUN yum install -y wget
RUN groupadd -r mysql && useradd -r -g mysql mysql
RUN wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
RUN rpm -ivh mysql-community-release-el7-5.noarch.rpm
RUN yum install -y mysql-server
RUN mkdir -p /var/lib/mysql /var/run/mysqld \
&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
&& chmod 777 /var/run/mysqld
VOLUME ["/var/lib/mysql"]
RUN /usr/bin/mysql_install_db
USER mysql
cmd ["mysqld"]
dockerfile的优化
a: 使用体积小的linux镜像alpine
b: 尽可能的清理无用的缓存文件(尽可能把多个RUN合并)
c: 修改dockerfile的时候,尽可能把修改的内容放在最后
d: 使用.dockerignore忽略构建docker镜像时,不需要的文件
11.使用 alpine 构建 docker 镜像
alpine 构建 nginx 镜像
docker run -it alpine:latest /bin/sh
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
apk update
apk add nginx
mkdir /run/nginx
nginx
hostname
exit
docker commit ed956cd97f1b alpine_nginx:v1
docker run -d -p 88:80 alpine_nginx:v1 nginx -g 'daemon off;'