docker基础(一)
docker入门docker和k8s一样基于go语言开发,为容器中的一种。什么是容器?一般说的容器指的是linux容器,指的是一组收到资源限制、彼此相互隔离的进程。多看官方文档:https://docs.docker.com/安装docker-cedocker组成:client、server、repository学习安装版本19.03.8,centos7,内核在3.10.以上安装安装指引:http
docker入门
docker和k8s一样基于go语言开发,为容器中的一种。
什么是容器?一般说的容器指的是linux容器,指的是一组收到资源限制、彼此相互隔离的进程。
多看官方文档:https://docs.docker.com/
安装docker-ce
docker组成:client、server、repository
学习安装版本19.03.8,centos7,内核在3.10.以上
安装
安装指引:https://docs.docker.com/engine/install/centos/,跳转get started
-
移除旧docker环境
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
设置仓库源
sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
安装engine
sudo yum install docker-ce docker-ce-cli containerd.io
如果安装指定版本,
yum list docker-ce --showduplicates | sort -r
例如19.03.8,则为docker-ce-19.03.8
-
启动docker的daemon进程
yum makecache fast systemctl start docker
-
登录docker id
docker login #登录一次即可记住密码
-
运行hello-world
docker run hello-world
启动顺序:先从本地repository寻找hello-world镜像→没有则去docker hub找,找到就pull下来,启动
-
配置阿里镜像加速器
登录阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,将mirrors地址修改为加速器地址,每人一个。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://n6eullnk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
docker为什么比vm快?
-
docker有比虚拟机更少的抽象层
-
docker直接运行在宿主机内核上,而vm需要guest os
也就是说,vm需要加载bootfs和rootfs,docker不需要重新引导加载一个操作系统内核,只需要加载rootfs即可,所以比vm快。
docker常用命令
帮助命令
官方帮助文档:https://docs.docker.com/engine/reference/run/
docker $cmd --help
docker version
docker info
镜像命令
#show
docker images -a #显示所有镜像
docker images -aq #只显示镜像id
#search
docker search mysql --filter=STARS=1000
#download
docker pull 镜像名[:tag]
[root@master docker]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a10c77af2613: Pull complete #层级下载,docker images的核心 联合文件系统
b76a7eb51ffd: Pull complete
258223f927e4: Pull complete
2d2c75386df9: Pull complete
63e92e4046c9: Pull complete
f5845c731544: Pull complete
bd0401123a9b: Pull complete
2724b2da64fd: Pull complete
d10a7e9e325c: Pull complete
1c5fd9c3683d: Pull complete
2e35f83a12e9: Pull complete
Digest: sha256:7a3a7b7a29e6fbff433c339fc52245435fa2c308586481f2f92ab1df239d6a29 #摘要
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
#不指定版本就是docker pull mysql相当于docker pull mysql:latest
#delete
docker rmi -f $imageid #删除指定镜像
docker rmi $(docker images -qa) #删除所有镜像
容器命令
docker pull centos
新建并启动容器、退出容器
docker run [可选参数] $image $cmd #这里的$image可以是镜像名,也可以是镜像id
#可选参数说明
--name="centos_test" #容器名称,用来区分容器,唯一
--it #使用交互命令进入容器
-d #后台方式运行
-p #指定端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P #随机端口
#例如:
[root@master docker]# docker run -it --name="centosTest" centos /bin/bash
[root@006a8fefaa3e /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@006a8fefaa3e /]# exit
exit
[root@master docker]#
#image默认是带了latest标签,当非latest的image时,启动需要指定标签,例如:
[root@master download]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx stable aedf7f31bdab 3 days ago 141MB
centos latest 5d0da3dc9764 2 months ago 231MB
[root@master download]# docker run -d --name="nginx01" nginx
Unable to find image 'nginx:latest' locally
^C
[root@master download]# docker run -d --name="nginx01" nginx:stable
8c8d36840b1f4689e60d4e71ad7df968b883ec8c136c44873129b2bf3024e7e0
列出容器
docker ps #列出正在运行的容器
-a #列出正在运行+历史运行过的容器
-q #只列出容器id
-n= #列出n个最近创建的容器
退出容器
exit #退出并停止容器,如果容器中有前台进程未结束,不会停止容器
ctrl + P + Q #退出不停止容器
#例如:
[root@master docker]# docker exec -it a8018e7463bf /bin/sh
sh-4.4# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
sh-4.4# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:19 ? 00:00:08 /bin/sh -c while true;do echo hello-beauty;sleep 0.5;done
root 13944 0 0 12:17 pts/0 00:00:00 /bin/sh
root 14100 1 0 12:18 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 0.5
root 14101 13944 0 12:18 pts/0 00:00:00 ps -ef
sh-4.4# logout
sh: logout: not login shell: use `exit'
sh-4.4# exit
exit
[root@master docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8018e7463bf centos "/bin/sh -c 'while t…" 2 hours ago Up 2 hours centos_test1
删除容器
docker rm 容器id #正在运行的不允许删除,如要删除需要加 -f
docker rm -f $(docker ps -aq) #强制删除所有容器
docker ps -aq|xargs docker rm -f #强制删除所有容器
启动和停止容器
docker start 容器id #docker run 相当于执行了docker create + docker start
docker restart 容器id
docker stop 容器id
docker kill 容器id #强制停止当前容器
docker run启动容器时,docker在后台做了啥?
- 检查本地是否存在指定镜像,如不存在则pull
- 利用镜像创建并启动一个容器,相当于docker create、docker start
- 分配一个rootfs文件系统,并在只读镜像层外面再挂一个读写层
- 从宿主机网桥接口中桥接一个虚拟接口到容器
- 从地址池中分配一个ip给容器
- 指定用户指定的应用程序
- 执行完毕后发现没有运行进程则停止容器
其他常用命令
后台方式运行容器
docker run -d $image
注意:如果容器运行后没有前台进程,即使用-d启动了,也不会在后台运行,会立即停止。所以上面容-d启动centos会立即退出。
[root@master docker]# docker run --name="centos_test1" -d centos /bin/sh -c "while true;do echo hello-beauty;sleep 0.5;done"
a8018e7463bf9ad8d5b7917cf18fa7032a026c4eb78c239392b4953961627716
[root@master docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8018e7463bf centos "/bin/sh -c 'while t…" 7 seconds ago Up 6 seconds centos_test1
docker run --rm #容器进程停止后自动删除,一般用于测试
-v 容器路径:docker内路径 #做路径映射
--restart=always #容器退出时总是重启容器,默认为no
查看容器日志
docker logs -tf --tail 条数 #类似于tail -f
例如:
[root@master docker]# docker logs -tf --tail 4 a8018e7463bf
2021-11-20T10:22:39.601730830Z hello-beauty
2021-11-20T10:22:40.117446018Z hello-beauty
2021-11-20T10:22:40.633493993Z hello-beauty
2021-11-20T10:22:41.148728319Z hello-beauty
2021-11-20T10:22:41.664642020Z hello-beauty
查看容器中的进程信息
docker top 容器id
例如:
[root@master docker]# docker top a8018e7463bf
UID PID PPID C STIME TTY TIME CMD
root 9969 9952 0 18:19 ? 00:00:00 /bin/sh -c while true;do echo hello-beauty;sleep 0.5;done
root 11031 9969 0 18:25 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 0.5
查看容器信息
docker inspect 容器id
docker stats #查看容器资源使用状态
进入运行的容器
#方式一:
docker exec -it 容器id $cmd
[root@master docker]# docker exec -it a8018e7463bf /bin/sh
sh-4.4# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#方式二:
docker attach [options] 容器id
[root@master docker]# docker attach a8018e7463bf
hello-beauty
hello-beauty
hello-beauty
hello-beauty
hello-beauty
两种方式的区别:方式一进入容器内工作目录,启动一个新的进程,方式二进入正在运行的程序的界面。
拷贝容器内文件到宿主机
docker cp 容器id:文件目录 宿主机目录
[root@master yiyu]# docker cp a8018e7463bf:/test.ss ./
练习
-
安装tomcat
-
安装nginx
-
安装es和kibana
[root@master download]# docker run -d --name="elasticsearch" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 7b31d3bfe95989f8f5d9ce9cc0a9e878deaeed1e51bdd719079a273b6af1e988
课外
安装portainer可视化面板,了解即可
[root@master download]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer:portainer
docker镜像原理
iamge有层级结构,docker image inspect 镜像名
最下面的layers就是它的层级。
[root@master download]# docker image inspect portainer/portainer
...
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:8dfce63a73970a18bcc2ca447d9c252aedd3157e9ee02a88e66c53571279aee9",
"sha256:11bdf2a940a7eb35fe69359d45eaeb6f8553a682a19e26db49d4c924588bb6c4",
"sha256:658693958bcb13c9d33a49d82f1e1297073066bec8d8b07dd49357ad5c08ce58"
docker pull下载的都是只读镜像层,docker run或者修改内容就相当于增加了一层容器层,commit后可以打包成镜像层。
提交docker镜像
docker commit -a="author" -m="desc" 镜像id 名称:标签
#运行基础镜像容器(以tomcat:9.0为例)
[root@master ~]# docker run -it --name="tomcat_local" -p 8080:8080 tomcat:9.0
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
...
22-Nov-2021 12:28:01.580 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [55] milliseconds
#进入容器,添加自定义内容
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0dbddcc71eb1 tomcat:9.0 "catalina.sh run" 36 seconds ago Up 34 seconds 0.0.0.0:8080->8080/tcp tomcat_local
[root@master ~]# docker exec -it 0dbddcc71eb1 /bin/bash
root@0dbddcc71eb1:/usr/local/tomcat# cp webapps.dist/* webapps/ -r
root@0dbddcc71eb1:/usr/local/tomcat# ls webapps
ROOT docs examples host-manager manager
#退出容器,测试,然后commit到本地repository
[root@master ~]# curl -I localhost:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 22 Nov 2021 12:34:52 GMT
[root@master ~]# docker commit -a="yiyu" -m="tomcat9.0 test version for local;added webapps dic" 0dbddcc71eb1 tomcat_local:1.0
sha256:c0855d5befbdeda543819e1b7d27a08c44642096ce54c...803a0e19f7aed
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat_local 1.0 c0855d5befbd 11 seconds ago 685MB
tomcat 9.0 76206e3ba4b1 3 days ago 680MB
更多推荐
所有评论(0)