title: Docker(2)
date: 2020-07-03
categories:
- Docker
tags: - Docker
- 容器
Docker(二)
redis 容器部署
拉取redis 镜像
docker pull redis
运行redis(redis 默认端口为6379)
docker run -di --name=myredis -p 6379:6379
进入容器
docker exec -it myredis /bin/bash
进入容器后操作redis
root@06017caff1e5:/data# cd /usr/local/bin/
root@06017caff1e5:/usr/local/bin# ls
docker-entrypoint.sh gosu redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
root@06017caff1e5:/usr/local/bin# ./redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set set ctzeng
OK
127.0.0.1:6379> get set
"ctzeng"
127.0.0.1:6379>
docker-compose
一个容器可以理解为一个服务
docker-compose将多个容器组合成一个项目—>使用docker-compose.yml可以同时启动容器和容器之间的依赖关系
安装
curl -L “https://github.com/docker/compose/releases/download/1.24.1/docker-compose-
(
u
n
a
m
e
−
s
)
−
(uname -s)-
(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
//改为可执行文件
[root@iZwz99ig7c1smtrw20di55Z ~]# chmod +x /usr/local/bin/docker-compose
[root@iZwz99ig7c1smtrw20di55Z ~]# docker-compose -v
docker-compose version 1.24.1, build 4667896b
//如需卸载 删除此文件即可
[root@iZwz99ig7c1smtrw20di55Z ~]# rm -f /usr/local/bin/docker-compose
小结:
部署项目时可以编写一个docker-compose.yml文件
####docker-compose 模板文件
指令格式:
docker-compose [-f 参数…] [options] [COMMAND] [ARGS…]
-f ,-file FILE指定使用的compose模板文件,默认为docker-compose.yml 可以多次指定
在此路径下存放配置文件
[root@iZwz99ig7c1smtrw20di55Z mycompose]# pwd
/usr/local/mycompose
配置好之后重启docker
[root@iZwz99ig7c1smtrw20di55Z mycompose]# systemctl restart docker
重启之后启动docker-compose -d是后台运行参数 如果没有则会进入命令行
[root@iZwz99ig7c1smtrw20di55Z mycompose]# docker-compose up -d
Creating network "mycompose_dev" with driver "bridge"
Creating network "mycompose_pro" with driver "bridge"
Creating redis1 ... done
Creating mysql1 ... done
Creating web1 ... done
docker-compose.yml 配置如下
version: "3"
services:
redis1:
image: redis
ports:
- "6379:6379"
container_name: "redis1"
networks:
- dev
mysql1:
image: centos/mysql-57-centos7
environment:
MYSQL_ROOT_PASSWORD: "root"
ports:
- "3306:3306"
container_name: "mysql1"
networks:
- dev
web1:
image: tomcat
ports:
- "8080:8080"
container_name: "web1"
networks:
- dev
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
启动之后可以查看docker容器运行情况 和网络配置情况
[root@iZwz99ig7c1smtrw20di55Z mycompose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a414e6a2b9d tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp web1
4d75abbb2718 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp redis1
775c9a16f383 centos/mysql-57-centos7 "container-entrypoin…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp mysql1
[root@iZwz99ig7c1smtrw20di55Z mycompose]# pwd
/usr/local/mycompose
[root@iZwz99ig7c1smtrw20di55Z mycompose]# ^C
[root@iZwz99ig7c1smtrw20di55Z mycompose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6cc3e194ea5e bridge bridge local
e8ad9e43d708 host host local
d6c97cc3c052 mycompose_dev bridge local
c9929f639734 mycompose_pro bridge local
3801267eee23 none null local
迁移与备份
在当前的容器中安装了各种组件,期望在其他服务器上也能快速拥有该容器的一切环境;可以将当前的容器作为镜像,再将当前镜像复制到其他服务器,其他服务器基于该镜像运行容器
1.将容器先保存为一个镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# docker commit mynginx mynginx
sha256:b65f0105d247f4cde3534a7c14ca52fc131201d0e1b7eb0910a8bbdb67fbfcb9
[root@iZwz99ig7c1smtrw20di55Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx latest b65f0105d247 8 seconds ago 132MB
redis latest 235592615444 3 weeks ago 104MB
tomcat latest 2eb5a120304e 3 weeks ago 647MB
nginx latest 2622e6cca7eb 3 weeks ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB
centos/mysql-57-centos7 latest f83a2938370c 8 months ago 452MB
[root@iZwz99ig7c1smtrw20di55Z ~]#
2.备份镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# docker save -o mynginx.tar mynginx
[root@iZwz99ig7c1smtrw20di55Z ~]# ll
total 133160
-rw------- 1 root root 136352256 Jul 5 21:04 mynginx.tar
3.恢复镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 235592615444 3 weeks ago 104MB
tomcat latest 2eb5a120304e 3 weeks ago 647MB
nginx latest 2622e6cca7eb 3 weeks ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB
centos/mysql-57-centos7 latest f83a2938370c 8 months ago 452MB
[root@iZwz99ig7c1smtrw20di55Z ~]# docker load -i mynginx.tar
a8c961e42b92: Loading layer [==================================================>] 24.06kB/24.06kB
Loaded image: mynginx:latest
[root@iZwz99ig7c1smtrw20di55Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx latest b65f0105d247 7 minutes ago 132MB
redis latest 235592615444 3 weeks ago 104MB
tomcat latest 2eb5a120304e 3 weeks ago 647MB
nginx latest 2622e6cca7eb 3 weeks ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB
centos/mysql-57-centos7 latest f83a2938370c 8 months ago 452MB
4.基于镜像运行容器
[root@iZwz99ig7c1smtrw20di55Z ~]# docker run -di --name=mynginx -p 80:80 mynginx
787302a165b366ca75a46b2e8702d00a2c6199c1f177f9243414d5ed80044ec0
[root@iZwz99ig7c1smtrw20di55Z ~]#
[root@iZwz99ig7c1smtrw20di55Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
787302a165b3 mynginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp mynginx
0a414e6a2b9d tomcat "catalina.sh run" 10 hours ago Up 10 hours 0.0.0.0:8080->8080/tcp web1
4d75abbb2718 redis "docker-entrypoint.s…" 10 hours ago Up 10 hours 0.0.0.0:6379->6379/tcp redis1
775c9a16f383 centos/mysql-57-centos7 "container-entrypoin…" 10 hours ago Up 10 hours 0.0.0.0:3306->3306/tcp mysql1
使用dockerfile 创建镜像
假设在centos7作为基础镜像上,添加jdk1.8并构建一个包含jdk1.8的centos7的新镜像
实现步骤:
1.拉取centos7 镜像
docker pull centos7
2.上传jdk1.8
[root@iZwz99ig7c1smtrw20di55Z ~]# mkdir -p /usr/local/dockerjdk8
[root@iZwz99ig7c1smtrw20di55Z ~]# cd /usr/local/dockerjdk8/
[root@iZwz99ig7c1smtrw20di55Z dockerjdk8]# ll
total 177192
-rw-r--r-- 1 root root 181442359 Jul 5 21:46 jdk-8u111-linux-x64.tar.gz
3.编写Dcokerfile文件:
内容:
FROM centos:7
MAINTAINER ITCAST
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u111-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_111
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
4.构建镜像
[root@iZwz99ig7c1smtrw20di55Z dockerjdk8]# docker build -t='jdk1.8' .
Sending build context to Docker daemon 181.4MB
Step 1/9 : FROM centos:7
---> b5b4d78bc90c
Step 2/9 : MAINTAINER ITCAST
---> Running in 6468e2ae8502
Removing intermediate container 6468e2ae8502
---> ed3bd8fddf32
Step 3/9 : WORKDIR /usr
---> Running in 0fe1ec74eef5
Removing intermediate container 0fe1ec74eef5
---> 755c00d9a462
Step 4/9 : RUN mkdir /usr/local/java
---> Running in 3639c04acf7a
Removing intermediate container 3639c04acf7a
---> bf2f1f85c15f
Step 5/9 : ADD jdk-8u111-linux-x64.tar.gz /usr/local/java/
---> 2b89ce4fced4
Step 6/9 : ENV JAVA_HOME /usr/local/java/jdk1.8.0_111
---> Running in 58486962b010
Removing intermediate container 58486962b010
---> dc0be6620fb1
Step 7/9 : ENV JRE_HOME $JAVA_HOME/jre
---> Running in 1e727351662a
Removing intermediate container 1e727351662a
---> 58a728a2b620
Step 8/9 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
---> Running in 526e23e4a714
Removing intermediate container 526e23e4a714
---> 76aeff80a706
Step 9/9 : ENV PATH $JAVA_HOME/bin:$PATH
---> Running in 7c598b87acfe
Removing intermediate container 7c598b87acfe
---> 016ac73f0b2c
Successfully built 016ac73f0b2c
Successfully tagged jdk1.8:latest
[root@iZwz99ig7c1smtrw20di55Z dockerjdk8]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk1.8 latest 016ac73f0b2c 7 seconds ago 569MB
mynginx latest b65f0105d247 58 minutes ago 132MB
redis latest 235592615444 3 weeks ago 104MB
tomcat latest 2eb5a120304e 3 weeks ago 647MB
nginx latest 2622e6cca7eb 3 weeks ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB
centos/mysql-57-centos7 latest f83a2938370c 8 months ago 452MB
5,测试(基于新镜像创建并运行容器,运行java -version)
[root@iZwz99ig7c1smtrw20di55Z dockerjdk8]# docker run -it --name=testjdk jdk1.8 /bin/bash
[root@bf0829d0f536 usr]# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
Docker私有仓库
1.拉取 registry镜像
[root@iZwz99ig7c1smtrw20di55Z dockerjdk8]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete
47112e65547d: Pull complete
46bcb632e506: Pull complete
c1cc712bcecd: Pull complete
3db6272dcbfa: Pull complete
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
2.运行registry镜像
[root@iZwz99ig7c1smtrw20di55Z dockerjdk8]# docker run -di --name=registry -p 5000:5000 registry
58ed1b411ee1cac4a0f47ae75db91ff176b5a6c708aef271eba68f2c7f275c96
3.编写daemon.json内容
添加 “insecure-registries”:[“宿主机ip:5000”]
[root@iZwz99ig7c1smtrw20di55Z ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries":["119.23.232.213:5000"]
}
4.重启并启动registry镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# systemctl restart docker
[root@iZwz99ig7c1smtrw20di55Z ~]# docker start registry
访问http://119.23.232.213:5000/v2/_catalog
页面出现{“repositories”:[]} 就说明成功
将镜像上传至私有库
1.标记镜像为私有仓库的镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# docker tag jdk1.8 119.23.232.213:5000/jdk1.8
2.再次启动私有仓库容器
[root@iZwz99ig7c1smtrw20di55Z ~]# docker restart registry
registry
3.上传标记的镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# docker push 119.23.232.213:5000/jdk1.8
4.访问http://119.23.232.213:5000/v2/_catalog
{"repositories":["jdk1.8"]}
从私有仓库中拉取镜像
若是在私有仓库所在服务器上去拉取镜像 ,那么则直接执行如下命令
1.因为私有仓库所在的服务器上自己存在相关镜像,所以先删除,请指定镜像名,不是id
[root@iZwz99ig7c1smtrw20di55Z ~]# docker rmi 119.23.232.213:5000/jdk1.8
Untagged: 119.23.232.213:5000/jdk1.8:latest
Untagged: 119.23.232.213:5000/jdk1.8@sha256:cf75d656b34e1aed5a9b881e77d2cef2566525e5a8e6a975f038e7a2f059e33c
2.拉取镜像
[root@iZwz99ig7c1smtrw20di55Z ~]# docker pull 119.23.232.213:5000/jdk1.8
Using default tag: latest
latest: Pulling from jdk1.8
Digest: sha256:cf75d656b34e1aed5a9b881e77d2cef2566525e5a8e6a975f038e7a2f059e33c
Status: Downloaded newer image for 119.23.232.213:5000/jdk1.8:latest
119.23.232.213:5000/jdk1.8:latest
[root@iZwz99ig7c1smtrw20di55Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
119.23.232.213:5000/jdk1.8 latest 016ac73f0b2c 2 hours ago 569MB
jdk1.8 latest 016ac73f0b2c 2 hours ago 569MB
mynginx latest b65f0105d247 3 hours ago 132MB
registry latest 2d4f4b5309b1 2 weeks ago 26.2MB
redis latest 235592615444 3 weeks ago 104MB
tomcat latest 2eb5a120304e 3 weeks ago 647MB
nginx latest 2622e6cca7eb 3 weeks ago 132MB
centos 7 b5b4d78bc90c 2 months ago 203MB
centos/mysql-57-centos7 latest f83a2938370c 8 months ago 452MB
3.可以通过如下命令查看docker的信息,了解私有仓库地址
docker info
其他服务器拉取私有仓库镜像
大多数情况下,都是某台服务器部署私有仓库之后;到其他服务器上从私有仓库中拉取镜像,若要拉取私有仓库镜像都需要去修改docker的配置文件,设置启动时的仓库地址
#打开配置文件
vi /usr/lib/systemd/system/docker.service
#在打开的上述文件中按照下面的图,添加如下的内容:注意修改下面内容的ip地址
--add-registry=私有仓库地址:端口号 --insecure-registry=私有仓库地址:端口号\
#修改完后需要重新加载docker配置文件并重启docker
systemctl daemon-reload
systemctl restart docker