1、看官网https://docs.docker.com/engine/install/centos/逐句指令复制粘贴运行一次即可
「记住安装软件,或者学习一项新技术,核心是看官方手册」
2、systemctl docker start
3、docker version
4、docker info
5、docker 命令 --help
「用help指令也是相当于看官网,但关键是不知道查什么」
6、docker run hello-world
7、docker images
8、卸载docker也是看官网操作
---------------------------------------------------------------------------------------------------------------------------
sudo docker version
sudo docker pull ubuntu
sudo docker images
sudo docker ps
sudo docker run ubuntu /bin/echo “hello world”
sudo docker run -i -t ubuntu /bin/bash
cat /proc/version
ls
exit
看版本
下载镜像
查看镜像
查看容器
在ubuntu镜像里生成一个容器输出helloworld
在ubuntu像像里生成一个可交互终端容器并运行bash环境
查看指定路径文件内容
当前路径目录列表
退出容器
---------------------------------------------------------------------------------------------------------------------------
1、docker images
功能:查看所有镜像
属性:repository库名 tag标签 imageid码 created创建日期 size大小
-a所有镜像
-q只显示ID
2、docker search mysql
功能:搜索dockerhub的mysql镜像
属性:name镜像名 description描述 stars引用次数 official automated官方自动化
--filter=STARS=3000
3、docker pull 镜像名:tag
功能:对第二步查到的库名进行pull操作
示例:docker pull mysql,是下载latest版的mysql,等价于docker.io/library/mysql:latest
4、docker rmi -f 镜像ID1 镜像ID2 镜像ID3
功能:删除镜像
示例:docker rmi -f $(docker images -aq),删除所有镜像
---------------------------------------------------------------------------------------------------------------------------
1、docker images
功能:查看所有镜像
属性:repository库名 tag标签 imageid码 created创建日期 size大小
-a所有镜像
-q只显示ID
2、docker search mysql
功能:搜索dockerhub的mysql镜像
属性:name镜像名 description描述 stars引用次数 official automated官方自动化
--filter=STARS=3000
3、docker pull 镜像名:tag
功能:对第二步查到的库名进行pull操作
示例:docker pull mysql,是下载latest版的mysql,等价于docker.io/library/mysql:latest
4、docker rmi -f 镜像ID1 镜像ID2 镜像ID3
功能:删除镜像
示例:docker rmi -f $(docker images -aq),删除所有镜像
---------------------------------------------------------------------------------------------------------------------------
1、docker run [可选参数] image
--name='Name' 容器名字
-d 后台
-it 交互方式(-d与-it二选一)
-p 指定端口,ip:主机端口:容器端口,ip可省
-P 随机指定
示例:docker run -it centos /bin/bash,ls,exit
2、docker ps [可选参数],显示正在运行的容器
-a 显示历史运行过的容器
-n=? 显示最近创建的?个容器
-q 只显示容器编号
3、exit 停止容器并退出
4、ctrl+p+q 不停止容器并退出
5、docker rm -f 容器ID
功能:删除容器
示例:docker rm -f $(docker ps -aq),删除所有容器
6、docker start 容器ID
7、docker restart 容器ID
8、docker stop 容器ID
9、docker kill 容器ID
10、docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
注意:没有前台进程,上面的容器一运行就会退出!
注意:只要未删除,即使容器停止了,数据仍存在!
11、docker logs -tf --tail 10 容器ID
……看容器日志
12、docker top 容器ID
……看容器信息
13、docker inspect 容器ID
……看容器元数据
14、docker attach ..(id)
……进入正运行的终端
15、docker exec -it ..(id)
……创建一个新的终端
16、docker stats
……查看资源使用情况
---------------------------------------------------------------------------------------------------------------------------
sudo docker
sudo docker stats --help
sudo docker ps -a
sudo docker start cae7475ce5d6
sudo docker ps -a
sudo docker restart cae7475ce5d6
sudo docker ps -a
sudo docker stop cae7475ce5d6
sudo docker ps -a
sudo docker run -itd --name ubuntu-test2 ubuntu /bin/bash
看有什么指令可以用
看stats指令怎么用
查看容器
开启容器
查看容器
重启容器
查看容器
停止容器
查看容器
在utuntu镜像下生成一个名为ubuntu-test2的交互式终端后台运行的容器并运行bash环境
---------------------------------------------------------------------------------------------------------------------------
docker rum -it centos /bin/bash
touch /home/test.java
exit
docker ps -a 查得ID
docker cp ID:/home/test.java ~
---------------------------------------------------------------------------------------------------------------------------
sudo docker attach 208e88d1df5b
exit
sudo docker ps -a
进入指定ID的容器
退出
查看所有容器(刚退出的容器已经结束)
sudo docker exec -it cae7475ce5d6 /bin/bash
exit
sudo docker ps -a
进入指定ID的容器
退出
查看所有容器(刚退出的容器仍在执行)
sudo docker export 208e88d1df5b > ubuntu.tar
cat ubuntu.tar | sudo docker import - test/ubuntu:v1
sudo docker images
导出指定ID的镜像
导入指定文件为镜像
查看当前镜像
sudo docker container prune
sudo docker rm -f f643c72bc252
sudo docker rmi -f f774ffed0361
删除处于终止状态的容器
删除指定ID的容器-f=--force
删除指定ID的镜像-f=--foce
---------------------------------------------------------------------------------------------------------------------------
docker search nginx
docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx
curl localhost:3344
此时任意找一台计算机访问公网IP:3344皆可访问,例如120.24.26.173:3344
补充示例:
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms 64m -Xmx512m" elasticsearch:7.6.2
……-e是改配置,-v是加映射
---------------------------------------------------------------------------------------------------------------------------
sudo docker search ubuntu
sudo docker tag ubuntutest:v3 15521108978/ubuntu:latest
sudo docker login
输入Docker用户名及密码
sudo docker push 15521108978/ubuntu:latest
sudo docker pull 15521108978/ubuntu:latest
查找当前ubuntu镜像
把本地的ubuntutest:v3复制一份并重命名为用户名/镜像名:标签15521108978/ubuntu:latest
登陆
推上去docker hub
拉下来docker hub(在docker hub官网可查到)
「综上,创建好的镜像有两上方法分享,一是上传到hub然后下载,二是export然后import,前者是无线故受网速影响,后者是生成文件可以用U盘传比较快故较麻烦」
---------------------------------------------------------------------------------------------------------------------------
利用已有本地镜像生成容器后添加文件或配置后commit生成新的镜像
---------------------------------------------------------------------------------------------------------------------------
cat ubuntu.tar | sudo docker import - ubuntuteswizardly_shternt:v1
exit
sudo docker images
sudo docker commit -m="cj_update" -a="cj" 629f5bf5518a ubuntutest:v2
sudo docker images
导入文件生成镜像ubuntutest,标签是v1
看一下现在的镜像
复制指定ID(刚生成)的镜像并生成新的镜像名为ubuntutest,标签是v3(如果不写标签则默认是latest),-m描述信息,作者是cj
再看一下镜像
sudo docker tag 3430cbc90928 ubuntutest:v3
复制指定ID的镜像并生成新的镜像,标签是v3
---------------------------------------------------------------------------------------------------------------------------
默认挂载:docker rum -it -v 主机目录:容器目录
匿名挂载:docker rum -it -v 容器目录,可以用docker volume ls查看,卷名是乱码
具名挂载:docker rum -it -v 卷名:容器目录,可以用docker volume ls查看
--->>>凡是没指定主机目录,主机目录都是在/var/lib/docker/volumes/xxx/_data
补充:docker rum -it -v 主机目录:容器目录:ro,ro表示readonly,则容器内部不能修改文件内容
示例:
1、mkdir ~/docker_file
2、docker run -it -v ~/docker_file:/home centos /bin/bash
3、cd /home,此处作为终端一,在容器内/home处
4、再开一个终端cd ~/docker_file,作为终端二,在主机内~/docker_file处
5、在终端一:touch 1.txt,在终端二,ls
6、在终端二:touch 2.txt,在终端一,ls
---------------------------------------------------------------------------------------------------------------------------
https://hub.docker.com/_/mysql
在docker_hub上下载的镜像都有使用教程
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
例如:docker run -d -p 3310:3306 -v ~/mysql/conf:/etc/mysql/conf.d -v ~/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
---------------------------------------------------------------------------------------------------------------------------
vim dockerfile1
from centos
volume["volume01","volume02"],注意这里的"volume01"是指在容器根目录下创建文件夹,即/volume01
cmd echo "---end---"
cmd /bin/bash
docker build -f dockerfile1 -t 15521108978/centos .,不要忘记最后有个小英文句号
docker images
docker run -it --name docker01 15521108978/centos /bin/bash
ls,这时会看到前面具名挂载的两个卷就在根目录下
cd volume01
touch 3.txt
回到宿主机终端,cd /var/lib/docker/volumes并ls,即可看到两个卷文件(乱码)
cd 第一个卷文件目录/_data
ls,这时会看到3.txt文件,表明docker01中的volume01就是映射到当前目录
docker run -it --name docker02 --volumes-from docker01 15521108978/centos
cd volume01
ls,这时会看到3.txt文件,因为run时--volumes-from docker01表明两个镜像共同卷,实现容器间通信
---------------------------------------------------------------------------------------------------------------------------
补充:
一、如果构建镜像时没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
二、如果手动镜像挂载时,多个容器都映射到宿主机同一个目录,也能实现容器间通信效果
三、数据卷数据其实都是存在宿主机,结束掉容器也不影响宿主机数据,自然不影响别的容器访问
四、我们可以在服务器一直跑一个docker_base的容器,然后有用户进来就创建一个子容器
……然后 --volumes-from docker_base 就能够实现容器间通信
五、build镜像时如果与已有镜像同name同tag,原镜像的name与tab都变成,但id仍存在
---------------------------------------------------------------------------------------------------------------------------
FROM:基础镜像
MAINTAINER:作者姓名+邮箱
WORKDIR:工作目录
VOLUME:挂载目录
COPY:复制…………………………从上下文目录中复制文件或者目录到容器里指定路径,可以用通配符
ADD:复制…………………………类似COPY,但复制的是tar包,会自动解压
EXPOSE:声明端口………………帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
RUN:执行命令……………………有两种格式:RUN <命令行命令> 或 RUN ["可执行文件", "参数1", "参数2"]
CMD:容器启动时要运行的命令………………run时只能重写命令
ENTRYPOINT:容器启动时要运行的命令……run时可以追加参数
ENV:环境变量
ARG:环境变量……………………与ENV的区别是ARG设置的环境变量仅在 Dockerfile 内有效。
USER:执行后续命令的用户和用户组
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
---------------------------------------------------------------------------------------------------------------------------
区分CMD与ENTRYPOINT:
在dockerfile1:
FROM centos
CMD ["ls","-a"]
建立镜像后生成容器时想追加一个“-l”属性:docker run 镜像ID ls -al
在dockerfile2:
FROM centos
ENTRYPOINT ["ls","-a"]
建立镜像后生成容器时想追加一个“-l”属性:docker run 镜像ID -l
---------------------------------------------------------------------------------------------------------------------------
例子一
FROM centos
MAINTAINER cj<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
---------------------------------------------------------------------------------------------------------------------------
例子二
第一步,在一空路径下创建app.py,内容是
# -*- coding:utf-8 -*-
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_flask():
return 'Hello'
app.run(host='0.0.0.0',port=8787)
[注意:必须要有host='0.0.0.0',否则会绑定127.0.0.1则容器外访问不到]
第二步:在同一路径下创建Dockerfile,内容是
FROM python
RUN pip install flask
COPY app.py /
EXPOSE 8787
第三步:在同一路径下打开命令台,指令是
sudo docker build -t python:flask .
sudo docker run -d -p 8788:8787 --name flask_test python:flask python app.py
[注意:可以用sudo docker logs flask_test看输出,上面的app.py其实相当于/app.py,就是根目录下,因为前面是COPY app.py /]
第四步:浏览器访问127.0.0.1:8788
---------------------------------------------------------------------------------------------------------------------------
[root@cjserver ~]# ip addr
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:
link/ether 00:16:3e:14:df:40 brd ff:ff:ff:ff:ff:ff
inet 172.17.13.224/20 brd 172.17.15.255 scope global dynamic noprefixroute eth0
valid_lft 314764515sec preferred_lft 314764515sec
inet6 fe80::216:3eff:fe14:df40/64 scope link
valid_lft forever preferred_lft forever
3: docker0:
link/ether 02:42:0b:d5:ce:f9 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:bff:fed5:cef9/64 scope link
valid_lft forever preferred_lft forever
第一个是回环地址127.0.0.1,第二个是阿里云内网地址172.17.13.224,第三个是docker0的地址172.18.0.1
现在我创建三个tomcat容器,然后ping 172.18.0.1,ping 172.18.0.2,ping 172.18.0.3,ping 172.18.0.4,ping 172.18.0.5
[root@cjserver ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
317982d0e87b tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 8080/tcp, 0.0.0.0:3333->80/tcp tomcat03
0aeece55ef1d tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 8080/tcp, 0.0.0.0:3332->80/tcp tomcat02
eca20d022cf6 tomcat "catalina.sh run" 16 minutes ago Up 16 minutes 8080/tcp, 0.0.0.0:3331->80/tcp tomcat01
ping 172.18.0.1:连通,本机
ping 172.18.0.2:连通,tomcat01
ping 172.18.0.3:连通,tomcat02
ping 172.18.0.4:连通,tomcat03
ping 172.18.0.5:不连通
总结:外网访问就是公网IP:端口即可访问对应容器提供的服务,宿主机内容器间访问用172.18.0.x即可
-------------------------------------------------------------------------------------------------------------------------------------------------
问题:上面的IP是定死的,不好维护,下面实现的是可以根据容器名字来连通
docker network ls
docker network --help
docker run -d -P --name tomcat04 tomcat 与 docker run -d -P --name tomcat04 --net bridge tomcat 等价,即默认是bridge模式
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
docker network inspect mynet,可以看到tomcat-net-01的IP是192.168.0.2,tomcat-net-02的IP是192.168.0.3
docker exec -it tomcat-net-01 ping 192.168.0.3,可以拼通
docker exec -it tomcat-net-02 ping 192.168.0.3,可以拼通
docker exec -it tomcat-net-01 ping tomcat-net-02,可以拼通
docker exec -it tomcat-net-02 ping tomcat-net-01,可以拼通
-------------------------------------------------------------------------------------------------------------------------------------------------
问题:承接上面,相同子网的容器间是可以连通了,那么不同子网的容器之间呢?
[root@cjserver ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e81c207be09 tomcat "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:49154->8080/tcp tomcat-net-02
8efead44ca33 tomcat "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:49153->8080/tcp tomcat-net-01
317982d0e87b tomcat "catalina.sh run" 3 hours ago Up 3 hours 8080/tcp, 0.0.0.0:3333->80/tcp tomcat03
0aeece55ef1d tomcat "catalina.sh run" 3 hours ago Up 3 hours 8080/tcp, 0.0.0.0:3332->80/tcp tomcat02
eca20d022cf6 tomcat "catalina.sh run" 3 hours ago Up 3 hours 8080/tcp, 0.0.0.0:3331->80/tcp tomcat01
docker network connect mynet tomcat01,把tomcat01容器加到mynet子网中,此时tomcat01有172.18.0.2与 192.168.0.4两个IP
docker network inspect mynet,可以看到tomcat01的IP是192.168.0.4
docker exec -it tomcat01 ping tomcat-net-01,可以拼通
docker exec -it tomcat01 ping tomcat-net-02,可以拼通
-------------------------------------------------------------------------------------------------------------------------------------------------
https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
https://docs.docker.com/compose/gettingstarted/
mkdir composetest
cd composetest
vim app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
chmod 777 app.py
vim requirements.txt
flask
redis
vim Dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
vim docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
docker-compose up
浏览器访问http://120.24.26.173:5000/
-------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------
dockerfile
第一步,在一空路径下创建app.py,内容是
# -*- coding:utf-8 -*-
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_flask():
return 'Hello'
app.run(host='0.0.0.0',port=8787)
[注意:必须要有host='0.0.0.0',否则会绑定127.0.0.1则容器外访问不到]
第二步:在同一路径下创建Dockerfile,内容是
FROM python
RUN pip install flask
COPY app.py /
EXPOSE 8787
第三步:在同一路径下打开命令台,指令是
sudo docker build -t python:flask .
sudo docker run -d -p 8788:8787 --name flask_test python:flask python app.py
[注意:可以用sudo docker logs flask_test看输出]
第四步:浏览器访问127.0.0.1:8788
sudo docker rmi -f ..(id)
[you can go to https://hub.docker.com/ to see your docker hub]
sudo docker push 15521108978/ubuntu:v1
sudo docker pull 15521108978/ubuntu
sudo docker run -itd ..(arguements)
sudo docker attach ..(id) 进入正运行的终端
sudo docker exec -it ..(id) 创建一个新的终端
exit
sudo docker container prune
sudo docker rm -f ..(id)
使用命令安装google chrome
使用 wget 命令获取 DEB 文件:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
使用dpkg从下载的 DEB 文件中安装 Chrome:
sudo dpkg -i google-chrome-stable_current_amd64.deb