docker安装前的准备
# 查看内核版本
uname -r
# 移除旧版本docker
yum remove docker \
docker-ce \
docker-common \
docker-logrotate \
docker-client \
docker-client-latest \
docker-latest \
docker-latest-logrotate \
docker-engine \
docker-selinux \
docker-engine-selinux \
-y
# 安装依赖
yum install -y lvm2 yum-utils device-mapper-persistent-data
# 添加docker源,更新yum缓存
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
docker安装
yum install -y docker-ce
docker换源并更换存储路径
mkdir /data
mkdir /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://pee6w651.mirror.aliyuncs.com",
"https://y0qd3iq.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"graph": "/data/docker"
}
ESC
:wq
网易云无法启动docker问题
# Ubuntu & Debian
sudo apt-get install bridge-utils -y
sudo brctl show
sudo brctl addbr docker0
sudo ifconfig docker0 172.17.0.1/16
sudo ifconfig docker0 up
sudo systemctl start docker
# CentOS
yum install bridge-utils -y
brctl show
brctl addbr docker0
ifconfig docker0 172.17.0.1/16
ifconfig docker0 up
systemctl start docker
# 原文链接
https://www.163yun.com/help/documents/56874253316968448
docker启动停止
# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker
# 停止docker
systemctl stop docker
# 开机运行docker
systemctl enable docker
# 开机不运行docker
systemctl disable docker
docker停止
systemctl disable docker
docker移除
yum remove docker-ce
docker目录移除
rm -rf /data/docker
docker-compose
docker拷贝主机文件到容器
docker cp [主机目录/主机文件] [容器id/容器名称]:[容器目录/容器文件]
docker查看容器改动
docker diff [容器id/容器名称]
docker镜像创建
docker commit -a [镜像作者] -m [镜像说明] [容器id/容器名称] [创建的镜像的名字]:[创建的镜像的版本(TAG标签)]
docker拉取镜像(可以忽略TAG标签,则docker取latest版本)
docker pull [镜像名称]:[TAG标签]
# 参数说明
-a 拉取指定镜像名称下所有TAG的镜像
--disable-content-trust 拉取镜像时忽略校验,默认开启
docker提交镜像
docker push [镜像名称]:[TAG标签]
# 参数说明
--disable-content-trust 提交镜像时忽略校验,默认开启
docker搜索镜像
docker search [搜索关键词]
# 参数说明
--automated 只列出automated类型的镜像
--no-trunc 显示完整的镜像描述
-s [数字] 最大搜索结果数
docker为镜像添加一个新名称+新标签
docker tag [原镜像名称]:[原TAG标签] [新镜像名称]:[新TAG标签]
docker登录/退出DockerHub
# 登录
docker login -u [用户名] -p [密码] [仓库地址(不声明则取默认)]
# 退出
docker logout [仓库地址(不声明则取默认)]
docker镜像管理
# 镜像列表
docker images
# 下载镜像(可以忽略TAG标签,则docker取latest版本)
docker pull [镜像名称]:[TAG标签]
# 参数说明
-a 拉取指定镜像名称下所有TAG的镜像
--disable-content-trust 拉取镜像时进行校验
# 下载镜像(示例)
docker pull nginx
docker pull php:7.3-fpm
# 删除镜像(要先删除镜像下所有的容器)
docker rmi [镜像id/镜像名称/镜像名称:TAG标签]
# 删除镜像(示例)
docker rmi nginx
docker rmi php:7.3-fpm
docker容器管理
# docker通过镜像运行一个容器(可以忽略TAG标签,则docker取latest版本)
docker run \
-d -i -t \
-p [服务器端口]:[docker端口] \
-p [服务器端口]:[docker端口] \
-p [服务器端口]:[docker端口] \
-v [主机目录]:[容器目录] \
-v [主机目录]:[容器目录] \
-v [主机目录]:[容器目录] \
--name=[容器名称(随便起名)] \
--privileged=[true|false] \
[镜像名称]:[TAG标签] \
[脚本命令]
# docker通过镜像创建一个容器(用法同run,只是创建后容器不会运行)
docker create \
-d -i -t \
-p [服务器端口]:[docker端口] \
-p [服务器端口]:[docker端口] \
-p [服务器端口]:[docker端口] \
-v [主机目录]:[容器目录] \
-v [主机目录]:[容器目录] \
-v [主机目录]:[容器目录] \
--name=[容器名称(随便起名)] \
--privileged=[true|false] \
[镜像名称]:[TAG标签] \
[脚本命令]
# docker在容器内运行命令
docker exec [容器id/容器名称] [命令行]
# docker查看运行容器
docker ps
# docker查看所有容器
docker ps -a
# docker移除容器(要先停止容器)
docker rm [容器id/容器名称]
# docker杀死容器
docker kill [容器id/容器名称]
# docker停止容器
docker stop [容器id/容器名称]
# docker启动容器
docker start [容器id/容器名称]
# docker重启容器
docker restart [容器id/容器名称]
# docker暂停容器中进程
docker pause [容器id/容器名称]
# docker恢复容器中进程
docker unpause [容器id/容器名称]
# docker查看容器进程
docker top [容器id/容器名称]
# docker连接到容器(运行中)
docker attach [容器id/容器名称]
# docker查看容器端口
docker port [容器id/容器名称]
# docker查看容器日志
docker logs [容器id/容器名称]
# docker查看容器进程
docker top [容器id/容器名称]
# docker检查容器状态
docker inspect [容器id/容器名称]
# docker实时事件查看
docker events \
-f 'image'=[镜像id/镜像名称] \
-f 'container'=[容器id/容器名称] \
--since=[十位秒数时间戳/日期YYYY-MM-DD] \
--until=[十位秒数时间戳/日期YYYY-MM-DD]
# 参数说明
-f 事件通过条件过滤
--since 事件通过开始时间过滤
--until 事件通过结束时间过滤
docker创建并运行容器示例
# 示例:通过镜像运行容器
docker run \
-d -i -t \
-p 80:80 \
-p 443:443 \
-v /www/:/www/ \
-v /etc/letsencrypt/:/etc/letsencrypt/ \
-v /usr/local/nginx/logs/:/etc/nginx/logs/ \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
--name=nginx-web \
--privileged=true \
nginx
# 参数说明
# 进行端口映射时,请先保证端口未被占用
# 进行路径映射时,请保证路径的正确性
-v [主机路径]:[容器路径]
-p [主机端口]:[容器端口]
docker创建DockerFile
mkdir /root/image
cd /root/image
vim DockerFile
FROM centos:7
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"]
ESC
:wq
docker下载镜像并命名为image:1.0
cd /root/image
docker build --rm -t image:1.0 .
docker通过image:1.0镜像生成一个名为image的容器
docker run \
-d -i -t \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--name=image \
--privileged=true \
image:1.0
docker连接到名为image的容器
docker exec -i -t image /bin/bash
docker在名为image的容器中安装nginx、mysql、php
wget http://xxx.xxx.xxx/xxx.tar.gz
tar -zxvf xxx.tar.gz
cd xxx
./configure
make
make install
...
# 通过systemd来管理服务的运行和开机启动
systemctl xxxxxxx
...
exit
docker登录
docker login -u [账号] -p [密码]
docker将容器打包到一个新镜像
docker commit -a 'ZhihuanGeng' -m 'CentOS LNMP IMAGE.Systemd enable.' image 2233466866/image:1.0
docker提交打包镜像到docker hub
docker push 2233466866/image:1.0
docker通过本地2233466866/image:1.0镜像运行一个test容器
docker run \
-d -i -t \
-p 80:80 \
-p 443:443 \
-p 3306:3306 \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--name=test \
--privileged=true \
2233466866/image:1.0
docker连接到test容器查看服务运行情况
docker exec -i -t test /bin/bash
ps aux|grep php
ps aux|grep mysql
ps aux|grep nginx
2233466866/lnmp
2233466866/lnnp
2233466866/centos
2233466866/centos8
# FROM语法
FROM scratch
FROM [镜像名称]
FROM [镜像名称]:[TAG标签]
FROM [镜像名称]@[镜像id]
# FROM作用
FROM 用来指定你要构建的镜像基于哪个镜像,如果不基于任何镜像则使用scratch
# MAINTAINER语法
MAINTAINER [维护者名称]
# MAINTAINER作用
MAINTAINER 用来声明维护者名称
# RUN语法
RUN [命令1] [参数1] [参数2]
RUN ["[命令2]", "[参数1]", "[参数2]"]
RUN ["[命令3]", "[参数1]", "[参数2]", "[参数3]"]
# RUN作用
RUN 用来在构建镜像时,按序执行一组命令
# ADD语法
ADD [主机目录/文件1] [镜像目录/文件1]
ADD ["[主机目录/文件2]","[镜像目录/文件2]"]
# ADD作用
ADD 用来将主机目录、主机文件或网络资源添加到要生成的镜像中,如果是tar文件则会将解压后的文件添加到要生成的镜像中,网络压缩资源不会解压
# COPY语法
COPY [主机目录/文件1] [镜像目录/文件1]
COPY ["[主机目录/文件2]","[镜像目录/文件2]"]
# COPY作用
COPY 用来将主机目录、主机文件或网络资源添加到要生成的镜像中
# CMD语法
CMD [命令1] [参数1] [参数2]
CMD ["[命令2]", "[参数1]", "[参数2]"]
CMD ["[命令3]", "[参数1]", "[参数2]", "[参数3]"]
# CMD作用
CMD 用来在启动容器时,按序执行一组命令
# ENTRYPOINT语法
ENTRYPOINT [命令1] [参数1] [参数2]
ENTRYPOINT ["[命令2]", "[参数1]", "[参数2]"]
# ENTRYPOINT作用
ENTRYPOINT 用来配置容器使其可执行化
# LABEL语法
LABEL [元数据1=值1] [元数据2=值2]
# LABEL作用
LABEL 用来为镜像添加元数据
# ENV语法
ENV [环境变量1=值1] [环境变量2=值2]
# ENV作用
ENV 用来设置环境变量
# EXPOSE语法
EXPOSE [端口1] [端口2]
# EXPOSE作用
EXPOSE 用来指定于外界交互的端口
# VOLUME语法
VOLUME ["[主机目录1]","[主机目录2]"]
# VOLUME作用
VOLUME 用来持久化目录映射到容器让所有容器共享,修改卷不会修改容器本身
# WORKDIR语法
WORKDIR [镜像目录]
# WORKDIR作用
WORKDIR 用来指定当前工作目录
# USER语法
USER root
# USER作用
USER 用来指定运行容器时的用户名
# ARG语法
ARG [变量名1=值1] [变量名2=值2]
# ARG作用
ARG 用于指定传递给构建运行时的变量
# ONBUILD语法
ONBUILD [触发器动作]
ONBUILD CMD ["curl","http://xxx.xxx.xxx/send_email?content=xxx"]
# ONBUILD作用
ONBUILD 用于设置镜像FROM触发器,即:当你的镜像被作为基础镜像时会触发指定动作
# 1. 下载redis镜像
docker pull redis:latest
# 2. 通过redis镜像运行一个redis容器
docker run -dit --name=redis redis:latest
# 3. 下载lnmp镜像
docker pull 2233466866/lnmp:latest
# 4. 通过lnmp镜像运行一个lnmp容器并link到redis
docker run -dit \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--privileged=true \
--link=redis \
--name=lnmp \
2233466866/lnmp
# 5. 进入lnmp容器
docker exec -it lnmp bash
# 6. 创建一个php文件
vim test.php
connect('redis', 6379);
$redis->set('a', '123');
echo $redis->get('a');
ESC
:wq
# 7. 运行php文件
php test.php
# 8. 可以看到运行结果输出了123
官方教程
快速入门