Docker实用指令和搭SSH服务的实战

简介: Docker实用指令和搭SSH服务的实战

Docker架构图

DockerFile常用指令

CMD 与 ENTRYPOINT 的区别

ENTRYPOINT 的目的和 CMD 一样,都是指定容器的启动程序及参数。

ENTRYPOINT 在运行时也可以通过 docker run 的参数 --entrypoint 来替代镜像中默认的ENTRYPOINT,通过 --entrypoint 传的必须是可执行的二进制程序, 即不会以sh -c 形式执行。

当指定了 ENTRYPOINT (exec格式)后,CMD 的含义就发生了改变,不再是直接运行的命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:<ENTRYPOINT> "<CMD>"

http://cloud.51cto.com/art/201411/457338.htm

 

 

ADD和COPY 的区别

COPY <源路径>... <目标路径>

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL

镜像中存在和当前需要拷贝或添加的文件夹同名的文件夹时,才能够拷贝或添加成功。

COPY指令不会做自动解压工作

原路径现在实测必须是DockFile目录下的相对路径

 

WORKDIR指令

用于指定容器的一个目录,容器启动时执行的命令会在该目录下执行,相当于设置了容器的工作目录

https://blog.csdn.net/yjk13703623757/article/details/79648381

 

ONBUILD指令

可以为镜像添加触发器。其参数是任意一个Dockerfile 指令。

该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。

但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

需要注意的是ONBUILD只能再构建子镜像中执行,对孙子镜像构建无效。

利用ONBUILD指令,实际上就是相当于创建一个模板镜像,需要在子镜像构建过程中执行的一些通用操作就可以在模板镜像对应的dockerfile文件中用ONBUILD指令指定。 从而减少dockerfile文件的重复内容编写。

 

VOLUME

使用 -v 来挂载一个主机上的目录到容器的目录

docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py

容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标

 

Docker实用命令

重启docker服务

sudo service docker restart

查看docker的详细信息

docker info

 

查看镜像

docker images

搜寻镜像

docker search mysql

docker search tomcat

删除镜像

docker rmi imageid

 

给镜像重命名(之后要docker rmi repository:tag 删除imageid相同的另镜像)

docker tag imageid repository:tag

 

基于Dockerfile构建镜像

docker build -t 镜像的tag .

docker build -f  /path/to/a/Dockerfile .

ps:

小数点.其实就是将当前目录设置为上下文路径。

-f Dockerfile文件的位置

 

 

 

存出镜像到本地文件

docker save -o ubuntu_14.01.tar ubuntu:14.04

从本地文件载入镜像

docker load --input ubuntu_14.01.tar

 

 

拉取镜像

docker pull ubuntu:16.04

docker pull tcbenkhard/centos6-jdk7 #Docker Hub 仓库下载一个Centos6并且安装了jdk7的镜像

docker pull dl.dockerpool.com:5000 ubuntu:16.04 #通过具体地址下载

docker pull  docker.io/tomcat

 

创建容器

docker create -it ubuntu:16.04

启动容器

docker start containId

 

创建并启动容器

-d: 在后端启动docker

-P:随机映射49000~49900到容器内部

-p:固定映射某个端口到容器内部

-t:进入终端

-i:获得一个交互式的连接,通过获取container的输入

-rm:容器一退出就删除

docker run -it docker.io/tcbenkhard/centos6-jdk7 /bin/bash

docker run -ti ubuntu:16.04 /bin/bash

联网启动

docker run -ti -p --expose 95 --name centos6 docker.io/tcbenkhard/centos6-jdk7 /bin/bash

docker run -ti -p 127.0.0.1:5000:5000 --name centos6 docker.io/tcbenkhard/centos6-jdk7 /bin/bash #映射指定地址的指定端口

 

查看本机所有容器

docker ps -a

进入容器

docker exec -ti containId /bin/bash

docker attach containId

 

获取 容器的所有日志

docker logs containId

 

查看容器的详细信息

docker inspect containId

 

使用镜像源创建一个指定镜像的标签

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

 

终止容器

docker stop containId

删除容器

docker rm -f containId

 

退出容器

Ctrl-D或者exit

 

封装镜像

docker commit containId sshd:v1

docker commit -m "this is a new iamges" -a "lzhcoder"

 

查看docker容器启动日志

dcoker logs containId

 

查看构建历史

docker history imageid

 

停止并且删除所有容器

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

 

根据镜像名或id称删除容器

docker rm $(docker ps -a | awk '/imageid/ {print $1}')

 

想要删除untagged images,也就是那些id为<None>的image的话可以用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

 

1.创建一个私有仓库

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry:2

-v 指定镜像上传目录为容器的/opt/data/registry 默认在容器的/tmp/registry

2.对已有镜像重新打tag

docker tag docker.io/ubuntu:16.04 192.168.199.4:5000/test:16.04

images[:tag] [registryhost][username/]name[:tag]

3上传镜像

 

搭建ssh服务的实战

一、centos6

1.centos6安装sshd

sshd

rpm -qa|grep -E "openssh"

yum install openssh*

https://blog.csdn.net/mengyoufengyu/article/details/72855524

遇到的问题:

1.1.File"/usr/bin/yum", line 29, in <module> File"/usr/share/yum-cli/yummain.py", line 276, in

就执行下面语句后再安装

cd /var/lib/rpm/

rm -i __db.*

rpm –rebuilddb

yum clean all

https://blog.csdn.net/a756041482/article/details/48215609

2启动sshd

sudo systemctl enable sshd sudo systemctl start sshd 或者 service sshd start

查看绑定端口

netstat -aunpt

显示用户所有终端下的进程

ps aux

遇到的问题

2.1Could not load host key: /etc/ssh/ssh_host_dsa_key

安装sshd之后执行

ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_dsa_key

 

3封装为镜像,并且运行

docker commit containId sshd:v1

docker run -p 127.0.0.1:8089:22 -ti sshd:v1

 

4启动sshd

/usr/sbin/sshd -D &

二、ubunto

1基于docker commit命令创建

1.1.apt-get update

 

1.2.安装python3

apt-get install python3

 

1.3.尝试使用sshd命令,会发现容器中并没有安装此命令

sshd

 

1.4.尝试安装openssh-server

apt-get install -y openssh-server

 

1.5.要正常启动ssh服务,需要目录/var/run/sshd存在,手动创建他,并启动服务

mkdir -p /var/run/sshd

/usr/sbin/sshd -D &

 

1.6.此时查看容器的22端口(SSH服务默认监听的端口),已经处于监听状态

apt-get install net-tools

netstat -tunlp

 

1.7.修改SSH服务的安全登录配置,取消pam登陆限制

sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

 

1.8.在root用户目录下创建.ssh目录,并复制需要登录的公钥信息

ssh-keygen -t rsa(客户端和服务端都执行一次)

cd root/.ssh

ls

显示id_rsa id_rsa.pub

把客户端的id_rsa.pub内容复制到服务端的id_rsa.pub

apt-get install vim

vi /root/.ssh/authorized_keys

 

1.9.创建自动启动SSH服务的可执行文件run.sh,并添加可执行权限:

vim /run.sh

chmod +x run.sh

run.sh的内容如下:

#!/bin/bash /usr/sbin/sshd -D &

1.10.保存镜像

sudo docker commit containId sshd:ubuntu

 

 

1.11.使用镜像,并添加端口映射(10022–>22),其中10022是宿主主机的端口,22是容器SSH服务监听端口

sudo docker run -it -d -p 10022:22 sshd/ubuntu:16.04 /run.sh

 

1.12.在客户端机通过ssh连接服务机10022端口:

ssh 192.168.199.4 -p 10022

或则

docker inspect containId

获取IPAddress

ssh IPAddress

 

2、使用Dockerfile创建

2.1.创建工作目录

mkdir -p sshd_ubuntu

2.2在其中创建Dockerfile和run.sh文件:

cd sshd_ubuntu/ && touch Dockerfile run.sh

 

2.3编写run.sh脚本和authorized_keys文件

vim run.sh cat run.sh

文件内容如下: #!/bin/bash /usr/sbin/sshd -D & cat /root/.ssh/id_rsa.pub > ./authorized_keys

 

2.3.编写Dockerfile

# cat Dockerfile

# 基础镜像信息

FROM ubuntu:14.04

 

# 维护者信息

MAINTAINER staryjie staryjie@163.com

 

# 更新apt缓存、安装ssh服务

RUN apt-get update && apt-get install -y openssh-server

RUN mkdir -p /var/run/sshd /root/.ssh

RUN sed -ri 's#session required pam_loginuid.so#session required pam_loginuid.so#g' /etc/pam.d/sshd

 

# 配置免密要和自启动脚本

ADD authorized_keys /root/.ssh/authorized_keys

ADD run.sh /run.sh

RUN chmod 755 /run.sh

 

# 暴露22端口

EXPOSE 22

 

# 设置脚本自启动

CMD ["/run.sh"]

 

2.4创建镜像

cd ~/sshd_ubuntu/ && docker build -t sshd:ubuntu2 .

 

2.5测试镜像,运行容器

docker run -it --name ssh_test -p 10122:22 sshd:ubuntu2 bash

 

参考文章

https://www.cnblogs.com/jsonhc/p/7767669.html

https://blog.csdn.net/qq626387/article/details/50506636

 


相关文章
|
3天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
18 3
实战~如何组织一个多容器项目docker-compose
|
19天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
28天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
21天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
67 0
|
22天前
|
存储 Cloud Native 开发者
深入探索容器化技术——Docker的实战应用
深入探索容器化技术——Docker的实战应用
35 0
|
22天前
|
存储 安全 Docker
Docker 的实战应用与优化策略
Docker 的实战应用与优化策略
33 0
|
23天前
|
JavaScript Linux 持续交付
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
48 0
|
29天前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
1月前
|
Kubernetes Docker 容器
掌握Docker容器化技术:从入门到实战
掌握Docker容器化技术:从入门到实战
27 0
下一篇
DataWorks