docker学习笔记

Day1安装

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环境
查看指定路径文件内容
当前路径目录列表
退出容器

---------------------------------------------------------------------------------------------------------------------------

 

Day2镜像命令

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),删除所有镜像

---------------------------------------------------------------------------------------------------------------------------

 

Day3 容器命令

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环境

---------------------------------------------------------------------------------------------------------------------------

 

Day4复制

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

---------------------------------------------------------------------------------------------------------------------------

 

Day5实例

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盘传比较快故较麻烦」

---------------------------------------------------------------------------------------------------------------------------

 

Day6版本

利用已有本地镜像生成容器后添加文件或配置后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

---------------------------------------------------------------------------------------------------------------------------

 

Day7 容器数据卷

默认挂载: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

---------------------------------------------------------------------------------------------------------------------------

 

Day8 容器数据卷的通信

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仍存在

---------------------------------------------------------------------------------------------------------------------------

 

Day9 dockerfile

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

---------------------------------------------------------------------------------------------------------------------------

 

Day10 docker网络

[root@cjserver ~]# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: mtu 1500 qdisc fq_codel state UP group default qlen 1000
    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: mtu 1500 qdisc noqueue state DOWN group default 
    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,可以拼通

-------------------------------------------------------------------------------------------------------------------------------------------------

 

Day11 docker compose

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/

-------------------------------------------------------------------------------------------------------------------------------------------------

暂时的未用到集群swarm与k8s,需要用多台服务器,将来学到再总结

-------------------------------------------------------------------------------------------------------------------------------------------------

 

速查记录:镜像与容器的增删改查

1.creat an image

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

2.kill an image

sudo docker rmi -f ..(id)

3.push an image

[you can go to https://hub.docker.com/ to see your docker hub]

sudo docker push 15521108978/ubuntu:v1

4.pull an image

sudo docker pull 15521108978/ubuntu

5.run a container

sudo docker run -itd ..(arguements)

6.enter and exit a container

sudo docker attach ..(id)     进入正运行的终端

sudo docker exec -it ..(id)   创建一个新的终端

exit

7.kill a container

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

你可能感兴趣的:(2021年研究生学习笔记)