namespaces
命名空间,Linux内核提供的一种对进程资源隔离的机制,例如进程、网络、挂载等资源cgroups
控制组,linux内核提供的一种限制进程资源的机制,例如cpu 内存等资源unonFS
联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-nightly #要每日构建版本的 Docker CE
yum-config-manager --enable docker-ce-test
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
$ docker version
$ docker info
docker info
yum remove docker
rm -rf /var/lib/docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker history <ID/NAME>
查看镜像中各层内容及大小,每层对应着Dockerfile
中的一条指令命令 | 含义 | 案例 |
---|---|---|
ls | 查看全部镜像 | docker image ls |
search | 查找镜像 | docker search [imageName] |
history | 查看镜像历史 | docker history [imageName] |
inspect | 显示一个或多个镜像详细信息 | docker inspect [imageName] |
pull | 拉取镜像 | docker pull [imageName] |
push | 推送一个镜像到镜像仓库 | docker push [imageName] |
rmi | 删除镜像 | docker rmi [imageName] docker image rmi 2 |
prune | 移除未使用的镜像,没有被标记或补任何容器引用 | docker image prune |
tag | 标记本地镜像,将其归入某一仓库 | docker image tag [imageName] [username]/[repository]:[tag] |
export | 导出容器文件系统tar归档文件创建镜像 | docker export -o mysqlv1.tar a404c6c174a2 |
import | 导入容器快照文件系统tar归档文件创建镜像 | docker import mysqlv1.tar zf/mysql:v2 |
save | 保存一个或多个镜像到一个tar归档文件 | docker save -o mysqlv2.tar zf/mysqlv2:v3 |
load | 加载镜像存储文件来自tar归档或标准输入 | docker load -i mysqlv2.tar |
build | 根据Dockerfile构建镜像 |
用户既可以使用
docker load
来导入镜像存储文件到本地镜像库,也可以使用docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
docker image ls
字段 | 含义 |
---|---|
REPOSITORY | 仓库地址 |
TAG | 标签 |
IMAGE_ID | 镜像ID |
CREATED | 创建时间 |
SIZE | 镜像大小 |
docker search ubuntu
字段 | 含义 |
---|---|
NAME | 名称 |
DESCRIPTION | 描述 |
STARTS | 星星的数量 |
OFFICIAL | 是否官方源 |
docker pull docker.io/hello-world
docker.io
是 image的作者,hello-world是 image 文件的名字docker.io
组里面,所以它的是默认组,可以省略 docker image pull hello-world
docker rmi hello-world
docker run
命令会从 image
文件,生成一个正在运行的容器实例。docker container run
命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取命令 | 含义 | 案例 |
---|---|---|
run | 从镜像运行一个容器 | docker run ubuntu /bin/echo 'hello-world' |
ls | 列出容器 | docker container ls |
inspect | 显示一个或多个容器详细信息 | docker inspect |
attach | 要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕 | docker attach |
stats | 显示容器资源使用统计 | docker container stats |
top | 显示一个容器运行的进程 | docker container top |
update | 显示一个容器运行的进程 | docker container update |
port | 更新一个或多个容器配置 | docker container port |
ps | 查看当前运行的容器 | docker ps -a -l |
kill [containerId] | 终止容器(发送SIGKILL ) | docker kill [containerId] |
rm [containerId] | 删除容器 | docker rm [containerId] |
start [containerId] | 启动已经生成、已经停止运行的容器文件 | docker start [containerId] |
stop [containerId] | 终止容器运行 (发送 SIGTERM ) | docker stop [containerId] |
logs [containerId] | 查看 docker 容器的输出 | docker logs [containerId] |
exec [containerId] | 进入一个正在运行的 docker 容器执行命令 | docker container exec -it [containerID] /bin/bash |
cp [containerId] | 从正在运行的 Docker 容器里面,将文件拷贝到本机 | docker container cp [containID]:app/package.json . |
commit [containerId] | 创建一个新镜像来自一个容器 | docker commit -a "zhufeng" -m "mysql" a404c6c174a2 mynginx:v1 |
docker run ubuntu /bin/echo "Hello world"
Docker以ubuntu镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果
参数 | 含义 |
---|---|
-i --interactive | 交互式 |
-t --tty | 分配一个伪终端 |
-d --detach | 运行容器到后台 |
-a --attach list | 附加到运行的容器 |
-e --env list | 设置环境变量 |
-p --publish list | 发布容器端口到主机 |
-P | --publish-all |
--mount mount | 挂载宿主机分区到容器 |
-v,--volumn list | 挂载宿主机分区到容器 |
docker ps
docker -a
docker -l
字段 | 含义 |
---|---|
CONTAINER ID | 容器ID |
IMAGE | 使用的镜像 |
COMMAND | 使用的命令 |
CREATED | 创建时间 |
STATUS | 状态 |
PORTS | 端口号 |
NAMES | 自动分配的名称 |
docker run -i -t ubuntu /bin/bash
我们可以通过运行exit命令或者使用CTRL+D来退出容器。
docker run --detach centos ping www.baidu.com
docker ps
docker logs --follow ad04d9acde94
docker stop ad04d9acde94
docker kill 5a5c3a760f61
kill是不管容器同不同意,直接执行
kill -9
,强行终止;stop的话,首先给容器发送一个TERM
信号,让容器做一些退出前必须的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内,容器还是没有停止,再进行kill -9,强行终止
docker rm 5a5c3a760f61
docker start [containerId]
docker stop [containerId]
docker attach [containerID]
docker container -exec -it [containerID] /bin/bash
docker container cp [containerID] /readme.md .
docker run --rm ubuntu /bin/bash
docker commit -m"hello" -a "zhangrenyang" [containerId] zhangrenyang/hello:latest
docker images
docker run zhangrenyang/hello /bin/bash
docker rm b2839066c362
docker rmi c79ef5b3f5fc
docker inspect
命令可以查看镜像或者容器docker inspect centos
命令 | 含义 | 案例 |
---|---|---|
FROM | 继承的镜像 | FROM node |
COPY | 拷贝 | COPY ./app /app |
WORKDIR | 指定工作路径 | WORKDIR /app |
RUN | 编译打包阶段运行命令 | RUN npm install |
EXPOSE | 暴露端口 | EXPOSE 3000 |
CMD | 容器运行阶段运行命令 | CMD npm run start |
表示要排除,不要打包到image中的文件路径
.git
node_modules
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
nvm install stable
node -v
npm i cnpm -g
npm i nrm -g
npm install express-generator -g
express app
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
cd
命令docker build -t express-demo .
.
表示Dockerfile文件的所有路径,.
就表示当前路径docker container run -p 3333:3000 -it express-demo /bin/bash
npm start
-p
参数是将容器的3000端口映射为本机的3333端口-it
参数是将容器的shell容器映射为当前的shell,在本机容器中执行的命令都会发送到容器当中执行express-demo
image的名称--rm
在容器终止运行后自动删除容器文件CMD npm start
docker login
docker image tag [imageName] [username]/[repository]:[tag]
docker image build -t [username]/[repository]:[tag] .
docker tag express-demo zhangrenyang/express-demo:1.0.0
docker push zhangrenyang/express-demo:1.0.0
docker volume --help
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
#把nginx-vol数据卷挂载到/usr/share/nginx/html
docker run -d -it --name=nginx1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx2 -v nginx-vol:/usr/share/nginx/html nginx
docker container stop nginx1 停止容器
docker container rm nginx1 删除容器
docker volume rm nginx-vol 删除数据库
docker volume ls #列出所有的数据盘
docker volume ls -f dangling=true #列出已经孤立的数据盘
docker volume rm xxxx #删除数据盘
docker volume ls #列出数据盘
-v
或--volumn
给它指定一下数据盘bind mounts
可以存储在宿主机系统的任意位置docker run -v /mnt:/mnt -it --name logs centos bash
cd /mnt
echo 1 > 1.txt
exit
docker inspect logs
"Mounts": [
{
"Source":"/mnt/sda1/var/lib/docker/volumes/dea6a8b3aefafa907d883895bbf931a502a51959f83d63b7ece8d7814cf5d489/_data",
"Destination": "/mnt",
}
]
Source
的值就是我们给容器指定的数据盘在主机上的位置 Destination
的值是这个数据盘在容器上的位置 mkdir ~/data
docker run -v ~/data:/mnt -ti --name logs2 centos bash
cd /mnt
echo 3 > 3.txt
exit
cat ~/data/3.txt
data
目录映射到/mnt
上docker create -v /mnt --name logger centos
docker run --volumes-from logger --name logger3 -i -t centos bash
cd /mnt
touch logger3
docker run --volumes-from logger --name logger4 -i -t centos bash
cd /mnt
touch logger4
docker里面有一个DNS服务,可以通过容器名称访问主机 网络类型
docker network ls
docker inspect bridge
docker run -d --name server1 nginx
docker run -d --name server2 nginx
docker exec -it server1 bash
ping server2
docker run -d --name server_none --net none nginx
docker inspect none
docker exec -it server_none bash
ip addr
docker run -d --name server_host --net host nginx
docker inspect none
docker exec -it server_host bash
ip addr
docker inspect nginx
443 80
docker run -d --name server_nginx -p "8080:80" nginx
docker inspect [容器名称]
docker port server_nginx
docker run -d --name webserver --publish 80 nginx
docker port webserver
docker run -d --name webserver --publish-all nginx
docker run -d --name webserver --P nginx
`
docker network create --driver bridge web
docker network inspect web
docker run -d --name webserver --net web nginx
docker network connect web webserver1
docker network disconnect web webserver2
docker-compose.yml
中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。docker-compose up
,Compose 将启动并运行整个应用程序。
配置文件组成pip install docker-compose
version: '2'
services:
zfpx1:
image: nginx
port:
- "8080:80"
zfpx2:
image: nginx
port:
- "8081:80"
apt update
#ping
apt install inetutils-ping
#nslookup
apt install dnsutils
#ifconfig
apt install net-tools
#ip
apt install iproute2
#curl
apt install curl
docker-compose up 启动所有的服务
docker-compose -d 后台启动所有的服务
docker-compose ps 打印所有的容器
docker-compose stop 停止所有服务
docker-compose logs -f 持续跟踪日志
docker-compose exec zfpx1 bash 进入zfpx服务系统
docker-compose rm 删除服务容器
docker network ls 网络不会删除
docker-compose down 删除网路
docker-compose up -d
docker-compose exec zfpx1 bash
ping zfpx2 可以通过服务的名字连接到对方
version: '2'
services:
zfpx1:
image: nginx
ports:
- "8080:80"
networks:
- "zfpx"
volumes:
- "access:/mnt"
zfpx2:
image: nginx
ports:
- "8081:80"
networks:
- "zfpx"
volumes:
- "access:/mnt"
zfpx3:
image: nginx
ports:
- "8082:80"
networks:
- "default"
- "zfpx"
networks:
zfpx:
driver: bridge
volumes:
access:
driver: local
version: '2'
services:
zfpx1:
image: nginx
ports:
- "8080:80"
networks:
- "zfpx"
volumes:
- "access:/mnt"
- "./zfpx1:/usr/share/nginx/html"
zfpx2:
image: nginx
ports:
- "8081:80"
networks:
- "zfpx"
volumes:
- "access:/mnt"
- "./zfpx2:/usr/share/nginx/html"
zfpx3:
image: nginx
ports:
- "8082:80"
networks:
- "default"
- "zfpx"
networks:
zfpx:
driver: bridge
volumes:
access:
driver: local
nodeapp 是一个用 Docker 搭建的本地 Node.js 应用开发与运行环境。
mariadb
作为应用的数据库node
服务nginx
作为应用的 web 服务器version: '2'
services:
node:
build:
context: ./images/node
dockerfile: Dockerfile
volumes:
- ./app/web:/web
depends_on:
- db
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./images/nginx/config:/etc/nginx/conf.d
- ./app/web/views:/mnt/views
depends_on:
- node
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "node"
MYSQL_USER: "zfpx"
MYSQL_PASSWORD: "123456"
volumes:
- db:/var/lib/mysql
volumes:
db:
driver: local
let http=require('http');
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'db',
user : 'zfpx',
password : '123456',
database : 'node'
});
connection.connect();
let server=http.createServer(function (req,res) {
connection.query('SELECT 2 + 2 AS solution', function (error, results, fields) {
if (error) throw error;
res.end(''+results[0].solution);
});
});
server.listen(3000);
"scripts": {
"start": "node server.js"
},
"dependencies": {
"mysql": "^2.16.0"
}
FROM node
MAINTAINER zhangrenyang <zhang_renyang@126.com>
WORKDIR /web
RUN npm install
CMD npm start
upstream backend {
server node:3000;
}
server {
listen 80;
server_name localhost;
root /mnt/views;
index index.html index.htm;
location /api {
proxy_pass http://backend;
}
}
功能 | 命令 |
---|---|
停止防火墙 | systemctl stop firewalld.service |
永久关闭防火墙 | systemctl disable firewalld.service |
docker network create lnmp
docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6 --character-set-server=utf8
yum install -y mysql
docker exec lnmp_mysql bash -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wordpress"'
mkdir -p /app/wwwroot
docker run -itd --name lnmp_web --net lnmp -p 8888:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
cd /opt/src
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz -C /app/wwwroot
http://IP:88/wordpress
http://192.168.20.129:8888/wordpress/wp-admin/setup-config.php
指令 | 含义 | 示例 | ||
---|---|---|---|---|
FROM | 构建的新镜像是基于哪个镜像 | FROM centos:6 | ||
MAINTAINER | 镜像维护者姓名或邮箱地址 | MAINTAINER zhufengjiagou | ||
RUN | 构建镜像时运行的shell命令 | RUN yum install httpd | ||
CMD | CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换 | CMD /usr/sbin/sshd -D | ||
EXPOSE | 声明容器运行的服务器端口 | EXPOSE 80 443 | ||
ENV | 设置容器内的环境变量 | ENV MYSQL_ROOT_PASSWORD 123456 | ||
ADD | 拷贝文件或目录到镜像中,如果是URL或者压缩包会自动下载和解压 | ADD |
||
COPY | 拷贝文件或目录到镜像 | COPY ./start.sh /start.sh | ||
ENTRYPOINT | 配置容器启动时运行的命令 | ENTRYPOINT /bin/bash -c '/start.sh' | ||
VOLUME | 指定容器挂载点到宿主自动生成的目录或其它容器 | VOLUME ["/var/lib/mysql"] | ||
USER | 为 RUN CMD和ENTRYPOINT执行命令指定运行用户 | USER zhufengjiagou | ||
WORKDIR | 为RUN CMD ENTRYPOINT COPY ADD 设置工作目录 | WORKDIR /data | ||
HEALTHCHECK | 健康检查 | HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMS curl -f htp://localhost | exit 1 | |
ARG | 在构建镜像时指定一些参数 | ARG user |
mkdir /usr/local/src
cd /usr/local/src
wget http://nginx.org/download/nginx-1.12.1.tar.gz
#如果容器内无法联网可以重启docker
systemctl restart docker
FROM centos
MAINTAINER zhufengjiagou
RUN yum install -y gcc gcc-c++ 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;"]
docker image build -t nginx:v1 -f Dockerfile .
wget http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
wget http://cn.php.net/distributions/php-5.6.30.tar.gz
FROM centos
MAINTAINER zhufengjiagou
RUN yum -y install gcc gcc-c++ make automake autoconf libtool openssl-devel pcre-devel libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel
ADD libmcrypt-2.5.8.tar.gz /tmp
RUN cd /tmp/libmcrypt-2.5.8 && \
./configure && \
make -j 2 && \
make install
ADD php-5.6.30.tar.gz /tmp
RUN cd /tmp/php-5.6.30 && \
./configure --prefix=/usr/local/php --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-mcrypt --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-config-file-path=/usr/local/php/etc --with-bz2 --with-gd && \
make -j 2 && \
make install
RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf
RUN sed -i '89a daemonize = no' /usr/local/php/etc/php-fpm.conf
RUN rm -rf /tmp/php-5.6.30 && yum clean all
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
docker image build -t php:v1 -f Dockerfile .
docker network create lnmp
docker run -itd \
--name lnmp_php
--net lnmp \
--mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html \
php:v1
docker run -itd \
--name lnmp_nginx
--net lnmp \
-p 8888:80 \
--mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html \
nginx:v1
docker run -itd \
--name lnmp_mysql
--net lnmp \
--mount type=bind,src=mysql-vol,dst=/usr/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456
mysql --character-set-server=utf8
wget https://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz?AuthParam=1555491494_9f57610fb0c84418f58ad1b9bc5a3be6
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.94/bin/apache-tomcat-7.0.94.tar.gz
FROM centos
MAINTAINER zhufengjiagou
ADD jdk-7u80-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.7.0_80
ADD apache-tomcat-7.0.94.tar.gz /usr/local
COPY server.xml /user/local/apache/conf
RUN rm -f /usr/local/*.tar.gz
WORKDIR /usr/local/apache-tomcat-7.0.94
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh","run"]
docker image build -t tomcat:v1 -f Dockerfile .
docker run -itd \
--name=tomcat
-p 8080:8080
--mount type=bind,src=/app/webapps,dst=/usr/local/apache-tomcat-7.0.94/webapps \
tomcat:v1
登录Docker Hub docker login
docker login --username=zhangrenyang --password=123456
镜像打标签 docker tag wordpress:v1 zhangrenyang/wordpress:v1
上传 docker push zhangrenyang/wordpress:v1
搜索测试 docker search zhangrenyang
下载 docker pull zhangrenyang/wordpress:v1